我想学习一种功能语言,以拓宽视野。我对Python和C / C ++有所了解,并希望从一个来自语言命令领域的人那里学习一门语言。我不在乎语言是否足够强大。我只是想要一门语言来学习函数式编程的基础,然后我会尝试更难(和更强大的语言)。
由于
答案 0 :(得分:8)
对于这些教学目的,我建议pure-lang。它也很强大。如果你想要更受欢迎/更多社区支持的东西,那么我建议使用Scheme或OCaml,这取决于你是否更愿意处理不熟悉的语法(与Scheme一起使用)或者首先处理不熟悉的键入(与OCaml一起使用)。 SML和F#与OCaml略有不同。其他人已经或将要提到Clojure,Scala和Haskell。
Clojure是Scheme的一个变种,具有自己的特性(例如没有尾调用优化),因此使用它将是一种以Scheme开头的方式。我希望你可以更轻松地使用不太特殊的Scheme实现。 Racket是经常用于教学的内容。 Scala看起来与OCaml基本相似,但这只是基于随意的熟悉程度。
与Haskell不同,提到的其他语言都有两个优点:(1)默认情况下评估顺序是急切的,尽管你可以通过特别请求它来获得懒惰的评估。在Haskell中则相反。 (2)可以使用变异,尽管您将看到的大部分库和代码都不使用它。我实际上认为学习函数式编程在教学上更好,同时着眼于它如何与副作用相互作用,并在未来的道路上努力学习monadic风格的作品。所以我认为这是一个优势。有些人会告诉你,最好先把Haskell更加隔离的mutaton处理抛弃。
Robert Harper在CMU has some nice blog posts on teaching functional programming。据我所知,他也喜欢像OCaml这样的语言进行教学。
在我推荐的三类语言中(Pure,Scheme和朋友,OCaml和朋友),前两种语言都有动态类型。第一个和第三个具有明确的引用单元格(就像在Python中一样,您限制自己永远不会重新分配变量,但您仍然可以更改列表索引中存储的内容)。 Scheme具有隐式引用单元:变量本身看起来是可变的,如在C和Python中,并且引用单元处理在封面下完成。在这样的语言中,你通常也可以使用某种形式的显式引用单元格(如我在Python中给出的示例,或在Racket中使用可变对/列表......在其他方案中,包括Scheme标准,这些是默认对/列表)。
Haskell确实拥有的一个优点是一些教科书正在出现。 (我的意思是真诚地,而不是狡猾。)使用哪些书籍/资源是许多战争/封闭问题的另一个有争议的问题。其他人推荐的SICP有很多粉丝和一些评论家。在我看来,有很多好的选择。我不会进一步讨论那些辩论。
答案 1 :(得分:4)
首先,阅读计算机程序的结构和实现。我推荐Lisp(例如,它的方言Scheme)作为第一种函数式编程语言。
答案 2 :(得分:2)
另一种选择是Clojure,我理解它比Scheme / Racket更“纯粹”功能(不要在这里询问我的细节),也可能类似于让它与SICP结合使用(计算机程序的结构和解释,也是另一个答案建议的强烈推荐的书。)
答案 3 :(得分:2)
我想学习一种功能语言,以拓宽视野。我对Python和C / C ++有所了解,并希望从一个来自语言命令领域的人那里学习一门语言。我不在乎语言是否足够强大。我只是想要一门语言来学习函数式编程的基础,然后我会尝试更难(和更强大的语言)。
很棒的问题!
在我20世纪90年代末开始进行函数式编程之前,我已经完成了BASIC,Pascal,汇编程序,C和C ++。然后我开始在几乎同时使用两种函数式语言,Mathematica和OCaml,并在几年内专门使用它们。特别是,OCaml让我编写了命令式代码,看起来像我之前编写的代码。我发现作为一个学习者很有价值,因为它让我比较了使ML的优势显而易见的不同方法。
然而,正如其他人所提到的,Mathematica和OCaml的核心优势是模式匹配,这在技术上与功能编程无关。我后来看了许多其他函数式语言,但我不想回到缺乏模式匹配的语言。
答案 4 :(得分:1)
这个问题可能是偏离主题的,因为它会导致无休止的语言战争,但这里有一些建议:
有一类函数式编程语言有时被称为“大部分功能性”,因为它们允许您需要的一些命令性功能。示例包括Standard ML,OCaml,F#和Scala。如果您希望能够掌握功能性习惯风格,同时仍能以合理熟悉的方式实现目标,则可以考虑其中之一。
我过去曾广泛使用过Standard ML,但如果你正在寻找一些学习曲线较少的东西,我个人会推荐Scala,这是我最喜欢的编程语言。其原因包括图书馆的普及,健康规模的社区,以及帮助您入门的好书和教程的可用性(特别是如果您曾经与Java打过交道)。
答案 5 :(得分:1)
未讨论的一个元素是代数数据类型的特殊模式匹配语法的可用性,如在Haskell中,所有类型的ML,以及可能提到的其他几种语言。模式匹配语法倾向于帮助程序员将其功能视为数学函数。 Haskell的语法足够复杂,并且其实现具有足够差的解析错误消息,语法是不选择Haskell的正当理由。 Scheme可能比大多数其他选项更容易学习(并且Scheme可能拥有所有宏系统之王),但缺少模式匹配语法会让我远离它以进行函数式编程的介绍。