- 没有一种范式是完美的。无论使用什么范式的单一范式语言都具有很强的限制性。
- Python或D2可以帮助你在完成实际工作的同时逐步了解函数式编程。而Haskell或Erlang则会迫使你在能够做任何有趣的事情之前一次性地学习函数式风格。
编辑:通过“杂交”函数式语言,我真正意思是带有函数式特色的强大多范式语言,而不是带有一些非函数式能力的强大函数式语言。
编辑:通过“杂交”函数式语言,我真正意思是带有函数式特色的强大多范式语言,而不是带有一些非函数式能力的强大函数式语言。
一切取决于你想要实现什么目标。如果你的目标是在一个函数式语言中编写生产代码,那么“纯”函数式语言可能会使其更加困难。
但是,如果你试图学习新的概念,“纯”语言会让你受益,因为它可以帮助你避免滑向非函数式概念的方向。一旦你清楚了这些差异,就可以去尝试混合环境,比如F#,但在此之前,很容易陷入面向对象的做事方式,错过函数式方法的优势。
在其他主题中,我提出了一个观点,认为学习F#的更好方法是从Haskell开始(这个观点被投票否决),但如果你学习F#是为了面向对象编程,那么学习F#还有什么意义呢?还不如留在C#中。
你已经接近回答自己的问题:
Haskell 或 Erlang 将会在你能够进行任何有趣的东西之前强制让你一次性学习函数式编程风格。
实际上,根据你所说的“有趣”,你可以在一周内就能够以 Haskell 提高生产力。
所有人学习 Haskell 的主要原因(语言理论家已经掌握它,其他类型的理论家忙于证明定理而不受编程困扰)是学习 Haskell 将改变你思考编程的方式。特别是类型系统、列表推导(被 Python 借鉴——最高的赞誉),以及使用模式匹配进行编程。你将能够在所有编程中使用许多新的想法。并且 Haskell 将强制你以其他语言无法做到的方式思考新的想法。
Erlang 是一种值得尊敬的语言,但是没有类似 Haskell 的类型系统。
如果你喜欢 Paul Graham,你可以阅读他的文章《打败平均数》,特别是关于“Blub 悖论”的部分。只需将 Lisp 替换为 Haskell :-)
因为仅有纯粹的声明式在操作语义层面上。纯函数式编程(即消除意外依赖)是并行所必需的。
此外,如果没有不可变性限制,你就不会被迫思考如何以与命令式编程一样快的速度执行算法,或者如何使用函数响应式编程模拟与现实世界的交互而不会出现状态混乱。
因此,你将无法最大化你编写最大程度可组合和可扩展代码的技能。