从单个输入生成序列的纯函数的术语是什么?

问题描述 投票:0回答:1

据我了解,map 函数将为数组输入返回数组结果,reduce 函数将为数组输入返回单个结果,过滤器将为数组输入返回数组结果。我也明白生成器函数不是纯粹的,因为它保存状态。

在函数式编程中,接受单个输入并生成元素序列的纯函数类的术语是什么?

此类函数的一个示例是从范围输入创建元素序列的函数。

我知道它不是“生成器”函数,因为生成器不被视为纯函数。

我知道它不是“映射”函数,因为它在输出序列中返回的元素比输入序列中的元素多。

我不认为这是一个“生成”功能,但可能是错误的。生成函数在离散数学中具有特定的含义。特别是,它意味着一个将生成无限级数的函数,绝对与此场景无关。

functional-programming
1个回答
0
投票

这实际上取决于您选择什么样的术语。例如,我不太清楚 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,但对于其他数据结构(例如eithertree),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 很懒,所以您可以使用变形来用纯函数生成无限序列。在其他语言中,您可能必须求助于迭代器或类似的东西才能达到相同的效果。

© www.soinside.com 2019 - 2024. All rights reserved.