Closed. This question is opinion-based。它当前不接受答案。












想要改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。

7年前关闭。



Improve this question




我想学习一种功能语言,以扩大我的视野。我拥有Python和C/C++的知识,并且我希望对来自命令性语言领域的人来说易于学习。我不在乎该语言是否足够强大。我只想学习一种语言,以便学习函数式编程的基础知识,然后我将尝试一种更困难(且功能更强大的语言)。

谢谢

最佳答案

我建议为这些教学目的使用pure-lang。它也很强大。如果您想要更流行的东西/获得更多社区支持,那么我建议使用Scheme或OCaml,具体取决于您是先处理不熟悉的语法(与Scheme一起使用)还是先处理不熟悉的类型(与OCaml一起使用)。 SML和F#与OCaml仅略有不同。其他人已经或将提到Clojure,Scala和Haskell。
Clojure是Scheme的一种变体,具有自己的特质(例如,没有尾部调用优化),因此使用它是从Scheme入手的一种方式。我希望您可以通过较少的特有方案实现而获得更轻松的时间。 Racket是经常用于教学的内容。 Scala从根本上看起来与OCaml类似,但这只是基于偶然的熟悉。
与Haskell不同,提到的其他所有语言都有两个优点:(1)默认情况下,求值顺序是急切的,尽管您可以通过特别请求获得懒惰的求值。在Haskell的相反。 (2)突变是可用的,尽管您将看到的许多库和代码都没有使用它。实际上,我认为在学习函数式编程的同时在教学上要好得多,同时要关注它与副作用的交互方式,并逐步研究单峰风格的合成。所以我认为这是一个优势。有些人会告诉你,最好先扔入Haskell对隔 ionic 更隔离的处理中。
罗伯特·哈珀(Robert Harper)在CMU has some nice blog posts on teaching functional programming上。据我了解,他还更喜欢OCaml之类的语言进行教学。
在我推荐的三类语言(Pure,Scheme和 friend ,OCaml和 friend )中,前两种具有动态类型。第一个和第三个具有显式引用单元格(就像在Python中一样,您限制自己不要重新提供变量,但仍可以更改存储在列表索引中的内容)。 Scheme具有隐式引用单元:变量本身看起来像C和Python中一样是可变的,并且引用单元的处理是在幕后进行的。在类似的语言中,您通常也可以使用某种形式的显式引用单元格(例如我刚刚在Python中给出的示例,或在Racket中使用可变对/列表...在其他Scheme(包括Scheme标准)中,这些是默认的配对/列表)。
Haskell确实拥有的一项优点是,正在为此出版一些教科书。 (我的意思是真诚的,而不是刻薄的。)要使用的书籍/资源是另一个有争议的问题,涉及许多 war / Unresolved 问题。正如其他人推荐的SICP一样,它拥有许多粉丝和批评家。在我看来,有很多不错的选择。我不会再冒险参加这些辩论了。

关于functional-programming - 对于具有命令式语言背景的人来说,哪一种是最简单的函数式编程语言?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11470206/

10-09 18:22