Functional programming 在哪个函数式编程函数中,一个人会增长一组项?

Functional programming 在哪个函数式编程函数中,一个人会增长一组项?,functional-programming,Functional Programming,三个选项中的哪一个(如果有的话(请提供备选方案))将用于向项目列表中添加元素 折叠 地图 滤器 还有,;如何添加项目?(附加到末尾/插入到工作项/其他之后)函数式编程中的列表通常定义为递归数据结构,它要么是一个特殊的空值,要么由一个值(称为“头”)和另一个列表(称为“尾”)组成。在哈斯克尔: -- A* = 1 + A x A* -- there is a builtin list type: data [a] = [] | (a : [a]) 要在头部添加元素,可以使用“cons”:一个

三个选项中的哪一个(如果有的话(请提供备选方案))将用于向项目列表中添加元素

  • 折叠
  • 地图
  • 滤器

还有,;如何添加项目?(附加到末尾/插入到工作项/其他之后)

函数式编程中的列表通常定义为递归数据结构,它要么是一个特殊的空值,要么由一个值(称为“头”)和另一个列表(称为“尾”)组成。在哈斯克尔:

-- A* = 1 + A x A*
-- there is a builtin list type:
data [a] = [] | (a : [a])
要在头部添加元素,可以使用“cons”:一个函数,它接受头部和尾部,并生成相应的列表

-- (:) is "cons" in Haskell
(:) :: a -> [a] -> [a]

x = [1,2,3]   -- this is short for (1:(2:(3:[])))
y = 0 : x     -- y = [0,1,2,3]
要在末尾添加元素,需要在列表中递归添加元素。你可以很容易地做到这一点与折叠

consAtEnd :: a -> [a] -> [a]
consAtEnd x = foldr [x] (:)
    -- this "rebuilds" the whole list with cons,
    -- but uses [x] in the place of []
    -- effectively adding to the end

在中间添加元素时,需要使用类似的策略:

consAt :: Int -> a -> [a] -> [a]
consAt n x l = consAtEnd (take n l) ++ drop n l
     -- ++ is the concatenation operator: it joins two lists
     -- into one.
     -- take picks the first n elements of a list
     -- drop picks all but the first n elements of a list
请注意,除了在头部插入之外,这些操作会跨越整个列表,这可能会成为性能问题。

在大多数函数式编程语言中,“cons”是用于构造各种数据结构(包括列表)的低级操作。在lispy语法中,它如下所示:

(cons 0 (cons 1 (cons 2 (cons 3 nil))))
这是一个链接列表

0 -> 1 -> 2 -> 3 -> nil
或者更准确地说

cons -- cons -- cons -- cons -- nil
  |       |       |       |
  0       1       2       3
当然,您也可以使用cons构建各种“树”状数据结构

树状结构可能看起来像这样

(cons (cons 1 2) (cons 3 4))
即视觉上:

  cons
  /  \
cons cons
/ \   / \
1 2   3 4
然而,大多数函数式编程语言将提供许多用于操作列表的“高级”函数

例如,在Haskell中

  • 附加:(++):[a]->[a]->[a]
  • 列表理解:[foo c | c[a]->[a](正如Martinho已经提到的)
  • 很多很多

总结一下,你不会经常像你想的那样对列表中的单个元素进行操作,这是一种命令式的思维方式。你更可能使用递归函数或类似的方法复制整个结构。编译器/虚拟机负责识别内存何时可以被调用可以就地修改和更新指针等。

集合没有终点。集合只是一组没有顺序的不同值。什么语言?上面的任何一种都不用于增加列表,它们用于折叠、映射函数,以及从列表中筛选值。语言不可知,可以随意使用任何语言作为示例。每个函数接受一组或一系列元素,但没有一个元素用于扩展该组或序列。折叠生成单个元素。映射生成具有相同元素数的集合或序列。筛选器生成大小小于或等于其输入的集合或序列。我怀疑我用于列表定义的语法不正确。如果知道如何修复,你能编辑或演示给我看吗?我不知道“在大多数函数式编程语言中构造各种数据结构,包括列表”部分。除了LISPs,我知道的所有FP语言都只对列表使用cons。其他数据结构是用其他机制构造的(即使您仍然可以使用cons来构建它们)哦,等等,LISP也只对列表使用cons:在LISP中,一切都是列表!这是真的,正如你在Haskell中所说的,你可能更倾向于使用更高级的东西,比如抽象数据类型等等。cons似乎是最接近于泛型构造函数的东西。如果你接受树是列表,你可以用ith haskell也有缺点:[1,2]:[[3,4]]。至少,让我这样说:根据您的观点,“数据结构”要么是API要么是内存布局。。。