我想学习一门函数式语言,以拓宽我的视野。我有Python和C/C++的知识,我想从来自命令式语言领域的人那里很容易地学习一门语言。我不在乎这门语言是否足够强大。我只是想要一种语言,以便学习函数式编程的基础知识,然后我会尝试一种更难(也更强大)的语言。
谢谢
发布于 2012-07-13 20:11:15
对于这些教学目的,我推荐使用pure-lang。它的功能也很强大。如果你想要更受欢迎/有更多社区支持的东西,那么我会推荐Scheme或OCaml,这取决于你是更愿意先处理不熟悉的语法(使用Scheme)还是更愿意处理不熟悉的类型(使用OCaml)。SML和F#只与OCaml略有不同。其他人已经或将要提到Clojure、Scala和Haskell。
Clojure是Scheme的一个变体,有它自己的特性(例如,没有尾部调用优化),所以使用它是从Scheme开始的一种方式。不过,我希望您使用一个不那么特殊的Scheme实现会更轻松一些。Racket是经常用于教学的工具。Scala看起来从根本上类似于OCaml,但这只是基于偶然的熟悉。
与Haskell不同,提到的其他语言都有两个优点:(1)默认情况下,求值顺序是渴望的,尽管您可以通过专门请求它来获得懒惰的求值。在Haskell中是相反的。(2)突变是可用的,尽管您将看到的大部分库和代码都不使用它。实际上,我认为在学习函数式编程的同时关注它与副作用的交互作用,并在以后的道路上努力实现一元式的组合,在教学上会更好。所以我认为这是一个优势。不过,有些人会告诉您,最好先使用Haskell对mutaton进行更隔离的处理。
罗伯特哈珀在CMU has some nice blog posts on teaching functional programming。据我所知,他也更喜欢像OCaml这样的语言来教学。
在我推荐的三种语言(纯语言、方案语言和朋友语言、OCaml语言和朋友语言)中,前两种语言支持动态类型。第一个和第三个都有显式的引用单元格(就像在Python中一样,您限制自己永远不能重新分配变量,但仍然可以更改存储在列表索引中的内容)。Scheme有隐含的引用单元格:变量本身看起来是可变的,就像在C和Python中一样,引用单元格的处理是在幕后完成的。在这样的语言中,您通常也可以使用某种形式的显式引用单元格(就像我刚才在Python语言中给出的例子一样,或者在Racket...in中使用可变的对/列表)。
Haskell确实有一个优点,就是一些教科书正在为它而出现。(我是真诚的,不是刻薄的。)使用什么书籍/资源是另一个有争议的问题,有许多战争/封闭的问题。正如其他人所推荐的那样,SICP有很多粉丝,也有一些批评者。在我看来,似乎有很多好的选择。我不会冒险进一步讨论这些争论。
发布于 2012-07-13 20:13:59
首先,阅读计算机程序的结构和实现。我推荐Lisp (例如,它的方言方案)作为第一种函数式编程语言。
发布于 2012-07-13 20:29:36
另一个选择是Clojure,据我所知,它比Scheme/Racket更“纯粹”实用(这里不要问我细节),而且可能足够相似,让你可以将它与SICP (计算机程序的结构和解释,这是另一个答案也推荐的一本强烈推荐的书)一起使用。
https://stackoverflow.com/questions/11470206
复制相似问题