据我了解,map 函数将为数组输入返回数组结果,reduce 函数将为数组输入返回单个结果,过滤器将为数组输入返回数组结果。我也明白生成器函数不是纯粹的,因为它保存状态。
在函数式编程中,接受单个输入并生成元素序列的纯函数类的术语是什么?
此类函数的一个示例是从范围输入创建元素序列的函数。
我知道它不是“生成器”函数,因为生成器不被视为纯函数。
我知道它不是“映射”函数,因为它在输出序列中返回的元素比输入序列中的元素多。
我不认为这是一个“生成”功能,但可能是错误的。生成函数在离散数学中具有特定的含义。特别是,它意味着一个将生成无限级数的函数,绝对与此场景无关。
这实际上取决于您选择什么样的术语。例如,我不太清楚 Generator 函数的含义,但一般来说,从单个起点生成序列的函数可能不需要是有状态的。
reduce 函数将为数组输入返回单个结果
不一定。更一般地, reduce 函数可以被认为是 fold 的特殊情况,虽然折叠可以将“可折叠”的东西(如数组)减少为单个值,但它也可以生成自身,如这个 Haskell 示例演示:
ghci> foldr (:) [] [1,2,3]
[1,2,3]
这也表明您可以使用一些折叠来实现“映射”(即函子功能):
ghci> foldr ((:) . show . (+) 1) [] [1,2,3]
["2","3","4"]
对于许多“可折叠”结构,fold相当于数据结构的catamorphism,但对于其他数据结构(例如either或tree),catamorphism是一个更普遍的概念。
因此,一般来说,变形是一个纯函数,它“遍历”数据结构并产生可能更紧凑的值作为输出。
变形的对偶被称为变形,或者更狭义地展开:
ghci> unfoldr (\b -> if b == 0 then Nothing else Just (b, b-1)) 10
[10,9,8,7,6,5,4,3,2,1]
因为 Haskell 很懒,所以您可以使用变形来用纯函数生成无限序列。在其他语言中,您可能必须求助于迭代器或类似的东西才能达到相同的效果。