Map和Reduce等概念是否适用于所有函数式编程语言?

时间:2009-04-28 02:36:16

标签: f# functional-programming

我刚开始深入研究函数式编程的世界。

许多OOP(面向对象编程)概念(如继承和多态)适用于大多数现代OO语言,如C#,Java和VB.NET。

但是Map,Reduce,Tuples和Sets等概念如何适用于所有FP(函数式编程)语言?

我刚刚开始使用F#。但上述概念是否适用于其他FP,如Haskell,Nemerle,Lisp等?

6 个答案:

答案 0 :(得分:6)

你打赌,打赌。关于函数编程的理想之处在于,您描述的数学概念更自然地在FP中表达。

这有点艰难,但John Backus'Turing Award paper在其中描述了功能(或“应用”)编程是一个很好的阅读。 Wikipedia article也很好。

答案 1 :(得分:2)

是;高阶函数,代数数据类型,折叠/ catamorphisms等几乎对所有函数语言都是通用的(尽管它们有时在每种语言中都有不同的名称)。

答案 2 :(得分:2)

功能工具适用于所有编程,而不仅仅是明确处理它的语言。例如,除了乱序评估之外,python还有mapreduce内置函数,它们完全符合您的预期。你需要像多处理模块这样的东西才能变得非常聪明。

即使语言没有提供准确的原语,大多数现代语言仍然可以通过更多的工作来获得所需的效果。这类似于类C类概念可以用纯C编码的方式。

答案 3 :(得分:2)

我会解释你所问的是什么,“是高阶函数(map,reduce,filter,...)和不可变数据结构(元组,缺点列表,记录,映射,集合......)在FP语言中常见吗?“我会说,绝对是的。

就像你说的那样,OOP拥有众所周知的支柱(封装,继承,多态)。函数式编程的“支柱”我会说1)使用函数作为一等值,2)表达自己没有副作用。

您可能会找到将这些想法应用于各种FP语言的常用工具(F#是一个很好的选择BTW!),您会看到他们进入更主流的语言;也许是一种不易识别的形式(例如LINQ的Select = map,Aggregate = reduce / fold,Where = filter,C#具有轻量级lambda语法,System.Tuple等)。

顺便说一句,非显式FP语言似乎普遍缺少的东西是良好的不可变数据结构和对它们的语法支持(不仅仅是一个库),这使得很难坚持那些支柱#2语言。 F#列表,记录,元组等都是很好的语言和图书馆组合支持的好例子。

答案 4 :(得分:1)

如果真的想要深入了解并理解为什么这些概念不仅仅是传统的,而是哼哼,基础,请查看论文{{3} }。

答案 5 :(得分:0)

它们适用于包含可以“映射”和“缩小”的数据类型的所有语言,即地图,数组/向量或列表。

在“纯lambda演算”语言中,每个数据结构都是通过函数应用程序定义的,您当然可以并行应用函数(即,在调用fn(expr1,expr2)中,您可以计算expr1和expr2 in并行),但这并不是map / reduce的真正含义。