我该选择哪种函数式编程语言作为第一种函数式编程语言?

19

我想学一门函数式编程语言,以了解不同的编程范例。

我的编程背景是:Java(我刚通过了SCJP考试),一些Ruby和非常有限的Rails。我使用bash来进行基本的系统管理任务。我使用Ubuntu 9.04。

第二个目标是,我想使用函数式编程来向14-18岁的孩子展示数学与计算机科学的相互关系。这些孩子非常擅长编程(他们从第一年起学习Python和Java),但是考试表明,他们在数学方面有困难,尤其是离散数学的基本概念。我认为我们可以通过编程来发展他们的数学技能(我可能会选择这个作为我的教师培训论文的主题)。我认为一门词汇非常基础的语言最适合这个项目。


1
排名前三(按投票数计算)的讨论涉及四种不同的编程语言。这就告诉我为什么这样的问题通常没有太大帮助。而且,既然你了解Ruby,它在一定程度上支持函数式编程,为什么不利用它来进一步理解相关概念呢?当我学习新的编程范式时,我通常会选择一种语言,在它上面工作一段时间(2/3天),如果由于某种原因我不喜欢它,就会尝试其他语言。当然,我也保留重新学习的选项。经验因人而异。 - dirkgently
1
与 http://stackoverflow.com/questions/744368/which-functional-programming-language-should-i-use 相比,该问题基本上有相同的答案,还有相关的 http://stackoverflow.com/questions/927272/what-is-the-best-functional-programming-language-for-experienced-oo-developers 和 http://stackoverflow.com/questions/1348896/what-is-the-best-functional-language-for-scientific-programming。我还没有投票关闭,但我不确定这是否真正添加了什么... - dmckee --- ex-moderator kitten
又一个近似重复的问题:http://stackoverflow.com/questions/779800 从新手的角度讨论了半打不同的函数式语言;一些人似乎发现它很有帮助。 - Norman Ramsey
首先很抱歉重复了一个问题。在提问之前,我会尽量更准确地浏览问题。 我想学习函数式编程,以便从新的角度看问题,并将这些新知识用于提高我的学生水平。所以让我澄清一下我的第二个问题:我想将数学与编程联系起来。这些人在编程方面很擅长,但他们的数学成绩较低。因此,我正在考虑可能的解决方案,利用他们对计算机科学的兴趣来探索数学概念。简要列表如下:朴素集合论、函数概念、命题逻辑、证明概念。 - txxwq
9个回答

17

我支持 Haskell,因为它有以下优点:

  • 在 Haskell 中,简单的情况实际上是简单的
  • 复杂的情况(通常)仍然可以被普通人理解
  • 它有一种普通的语法,与其他非函数式编程语言不会有太大的区别(不像 Lisp 那样)

1
我想再次强调并补充一下,这本书是非常好的入门书籍。http://book.realworldhaskell.org/ - Yoric

12

1
SICP 不是关于 Scheme 最好的书籍,而是《小 Schemer》(前身为《小 Lisper》)。 - HandyGandy
好的,让我修改一下我的陈述,说这是其中一本最好的书籍之一,而且它是免费提供的。我必须拿到《小小计算机》的副本。 - Jon

10
如果您的主要目标是与青少年一起工作,那么使用已被证明适用于青少年的功能性语言教学法和技术是有意义的,其中包括PLT Scheme(又名DrScheme)和How To Design Programs书籍(也可免费在线访问)。这些人在中学到第三学期大学取得了良好的成果。他们还为教师提供了资源

许多回答者喜欢SICP。它是一本精美的书籍,但不适合初学者。如果您已经了解Scheme,则可以欣赏此书,但SICP更多地关注的是如何在Scheme中实现所有已知的有趣计算机科学思想。

如果您的主要目标是学习一种全新的编程范式,那么Scheme缺少许多对许多函数式程序员非常重要的功能:

  • 使用模式匹配进行编程
  • 部分应用柯里化函数
  • 多态静态类型系统
  • 纯函数式计算

如果您想了解令人兴奋的想法,请尝试Haskell;Haskell使您更难以在新语言中编写旧思想。此外,Real World Haskell也是免费在线访问的众多资源之一。

最后注意:SO对于学习函数式编程有许多类似的问题


Scheme和How To Design Programs看起来非常不错。非常感谢! - txxwq

8

Scala和Clojure都在JVM上运行,因此您可能更熟悉它们的环境。


2
考虑到已经具备Java背景,这些可能是理想的选择。如果他有微软背景,我会推荐F#。 - Joel Etherton

7
我建议尝试使用Scala。它不是纯函数式的,允许您使用各种方法--但您的Java知识应该可以移植(它基于JVM),包括JDK库,并且它是我见过最先进的语言之一。
如果您有兴趣学习语言特性并扩展自己对语言的了解,我想不出比这更好的选择了。

1

我推荐Scala或F#,它们目前都可以免费下载。

这里的优势在于它们是混合范式语言--本质上是函数式语言,但你也可以使用命令式和面向对象编程。它们还有大型标准库--Scala基于Java,而F#则拥有整个.NET,因此你可以相对快速地编写出有趣的程序。

Scheme和Haskell都是纯函数式语言,但不幸的是它们的标准库相对较小,所以做一些相对常见的事情,比如解析XML或扫描网页,会有一定难度。


0

既然您已经熟悉Python,为什么不直接使用其函数功能呢?更多信息,请参见(草稿) HowTo


Python作为一种函数式语言来说,相对来说并不出色。当然,它支持一些你在函数式语言中期望找到的常见元素(闭包、一等函数,甚至像map这样的函数),但这并不能使它成为一个函数式语言。函数式编程更多地关乎一种风格,而不是特定的语言元素,而Python并没有强制(或者说真正鼓励)函数式编程风格。此外,如果你使用Python来教授现有程序员函数式编程,他们很可能会将Python的命令式方面作为捷径来使用。 - mipadi
这些人熟悉Python,而我不熟悉。但是我会阅读它的fp功能,因为我认为用一种已知的语言来接触新的编程风格会更容易。 - txxwq

0

我的问题是,对于你正在与之合作的青少年来说,哪种方法最有可能是最好的。如果他们愿意学习一些新的和不同的东西,Scheme作为一种函数式语言是一个很好的选择。它非常基础。如果你想保持更熟悉的语法,Haskell可能是你的答案。


0
如果您是为了学习而进行编程,那么一定要学习《计算机程序的构造和解释》(Scheme)SICP。如果您没有相关经验,这将会很困难、令人沮丧并且让您大开眼界,但是您会学到很多。
如果您想要在实践中使用函数式编程,那么值得关注的是 F#、Scala 和 Clojure。

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