函数式语言提供明确的数据结构表示意味着什么?

时间:2017-02-12 13:33:38

标签: functional-programming

我读过第1.13章AN INTRODUCTION TO FUNCTIONAL PROGRAMMING THROUGH LAMBDA CALCULUS并看到它。在命令式语言中通常不存在什么是“显式数据结构表示”?请问有人举个例子吗?

1 个答案:

答案 0 :(得分:1)

  

有人可以举个例子吗?

这只是隐式结构Array的一个例子,与显式结构,Linked List相比。

以下程序可以用无数种方式编写。这两个例子都不是特别惊人。每个示例都只是为了展示您期望在野外看到的代码。

<强>概述

数组是一个 - 明显,模糊的index - &gt; value映射桶。它需要使用任意索引输入来读取值。你可以&#34;迭代&#34;通过使用计数器,但实际上计数器与数组本身没有任何关系 - 你仍然只是使用任意索引执行随机查找 - 如果它们恰好位于&#34中并不重要;序列&#34;或不。

enter image description here

Linked List显式结构化数据容器。它具有定义的开始,结束和有意义的方式,以编程方式与结构交互。处理列表以car开头,然后使用cdr继续,直到找到 null 终结符。它还有明确的方法来创建新对(cons)。

enter image description here

非显式代码示例

这里我们有一个用JavaScript编写的命令式程序。这个计划可以说没有结构。

  • xs是一个全局定义的数组,基本上是一大堆分配 - 链接到 indices
  • doSomething根据提供的索引更改分配 - 它在<{1}}上隐式
  • xs还具有隐含的 main知识 - 至少,它隐含有xsdoSomething进行操作的知识
  • 还注意到因为xs只设置了已知索引的新分配,所以变异原始输入
  • doSomething没有明确的输出; 隐式依赖于main来更改基础数据,doSomething

&#13;
&#13;
xs
&#13;
&#13;
&#13;

显式代码示例

这是一个用Racket编写的功能风格的程序。

  • function doSomething (i) { xs[i] = 'changed' } function main () { doSomething(1) doSomething(2) } let xs = ['a', 'b', 'c', 'd', 'e'] console.log(xs) // [ 'a', 'b', 'c', 'd', 'e' ] console.log(main()) // undefined console.log(xs) // [ 'a', 'changed', 'changed', 'd', 'e' ]仍然是全局定义的,但它采用已知的显式结构 - Linked List
  • xs无法再直接引用索引重新分配值。相反,它需要索引输入和显式结构化列表输入 - 然后才能递归地构建一个带有 new 值的 new 列表。适当的位置。
  • doSomething无法再忽略其操作的数据 - main 显式并有目的地通过连续的xs调用进行线程化,使用返回值每个,并最终返回最终结果
doSomething