应用于命令式语言的函数式编程精神的现实生活示例是什么?

4
大多数人认为即使功能性编程更不可能让你找到工作,但通过学习它你可以成为更好的命令式/OO程序员。
对我来说,主要是编写没有副作用的“non-member non-friend”函数。但我无法举出更多例子说明在命令式语言中可以有效应用函数式编程,因为绕过语言的特性通常太过繁琐。
那么有哪些更具体的例子/技术是你实际应用于非函数式语言的,而这些例子/技术受到了函数式编程的启发呢?

我自己的另一个经验

这一点相当抽象,但由于大多数FP语言中缺乏“对象”,所以那里的文化倾向于严格的数据结构设计。通常,在面向对象的语言中,由于在类中添加额外变量太容易了,事情很快就会变得混乱。虽然使用OCaml和Haskell的记录语法也可以完成同样的事情,但这种方法在函数式编程中似乎不合适。

在某种程度上,这取决于编程语言。有些语言使函数式编程技术变得非常冗长,以至于大多数模式根本无法翻译,否则代码会变得混乱(例如:Java)。而在JavaScript和C#中,有许多函数式编程习惯用法是完全有帮助和适用的。 - Kirk Woll
http://jparsec.codehaus.org/ 可以作为一个不错的惯用例子。 - SK-logic
@Kirk Woll,Java并不那么糟糕,请参考http://functionaljava.org/。 - SK-logic
1
@SK-logic,当我们谈论的语言甚至不支持函数(或方法)作为语言的一等公民(可以传递)时,那么这种语言确实不适合容纳函数式习惯用法。例如,在Java中尝试将回调传递给方法。如果您正在使用接口的匿名实现,则会看到我所指的令人发指的样板代码量。现在,话虽如此,Java 最终将拥有这样的功能。但在那之前,它还是相当粗糙的。 - Kirk Woll
4个回答

2

数据转换

在我的经验中,从函数的角度思考如何解决问题会使你更多地考虑哪些数据需要被转换成什么,而不是需要改变什么状态以使事情正常运行...

问题视为转换会让它们看起来与众不同,这会导致不同且可能更优雅的解决方案。

更新:在c++中,有一个名为<functional>头文件和<algorithm>中的std::transform函数。


在C++1x(带有lambda表达式)普及之前,<functional>和<algorithm>会在周围的代码中引入大量噪音(例如,创建一个本地的“struct”来定义“operator()”)。截至我上次检查,编译器对于C++1x的支持仍然不太适合重度使用。 - kizzx2
@kizzx2,你说得对 :) - boost::lambda 也往往会很吵... - Marcus Borkenhagen

0

新近推出的JavaScript数组函数,filter、map、every、some、reduce和reduceRight,受到了函数式编程的启发。


0

0

大多数 Ruby Enumerable 方法都受到函数式编程中的高阶函数的启发。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接