9

我想学习一门函数式语言以拓宽我的视野。我有 Python 和 C/C++ 方面的知识,并且我希望一种语言易于从来自命令式语言领域的人那里学习。我不在乎语言是否足够强大。我只想要一门语言来学习函数式编程的基础,然后我会尝试更难(和更强大的语言)。

谢谢

4

6 回答 6

10

我建议将纯语言用于这些教学目的。它也很强大。如果您想要更流行/获得更多社区支持的东西,那么我会推荐 Scheme 或 OCaml,这取决于您是更愿意先处理不熟悉的语法(使用 Scheme)还是处理不熟悉的类型(使用 OCaml)。SML 和 F# 与 OCaml 仅略有不同。其他人已经或将提到 Clojure、Scala 和 Haskell。

Clojure 是Scheme 的一个变体,有它自己的特性(例如没有尾调用优化),所以使用它是从Scheme 开始的一种方式。不过,我希望您使用不那么特殊的 Scheme 实现会更轻松。球拍是经常用于教学的东西。Scala 看起来与 OCaml 基本相似,但这只是基于偶然的熟悉。

与 Haskell 不同,提到的其他语言都有两个优点:(1)默认情况下评估顺序是急切的,尽管您可以通过专门请求它来获得惰性评估。在 Haskell 中则相反。(2) 可以使用突变,尽管您将看到的大部分库和代码都没有使用它。实际上,我认为学习函数式编程在教学上更好,同时关注它如何与副作用交互,并在某种程度上努力实现单子风格的组合。所以我认为这是一个优势。不过,有些人会告诉你,最好先投入到 Haskell 更加隔离的 mutation 处理中。

CMU 的 Robert Harper有一些关于教授函数式编程的不错的博客文章。据我了解,他也更喜欢像 OCaml 这样的语言进行教学。

在我推荐的三类语言(Pure、Scheme and friends、OCaml and friends)中,前两类具有动态类型。第一个和第三个具有显式引用单元格(就像在 Python 中,您限制自己永远不会重新分配变量,但您仍然可以更改存储在列表索引中的内容)。Scheme 有隐式引用单元:变量本身看起来是可变的,就像在 C 和 Python 中一样,并且引用单元处理是在幕后完成的。在这样的语言中,您通常也有某种形式的显式引用单元格可用(如我刚刚在 Python 中给出的示例,或者在 Racket 中使用可变对/列表......在其他方案中,包括方案标准,这些是默认对/列表)。

Haskell 确实拥有的一个优点是一些教科书正在出现。(我的意思是真诚的,而不是刻薄的。)使用什么书/资源是另一个有争议的问题,有许多战争/封闭的问题。其他人推荐的 SICP 有很多粉丝,也有一些批评者。在我看来,有很多不错的选择。我不会冒险进一步讨论这些辩论。

于 2012-07-13T12:11:15.010 回答
4

首先,阅读计算机程序的结构和实现。我推荐 Lisp(例如,它是方言 Scheme)作为第一种函数式编程语言。

于 2012-07-13T12:13:58.737 回答
3

另一个选择是 Clojure,我知道它比 Scheme/Racket 更“纯粹”的功能(不要在这里问我细节)并且可能足够相似,可以让您将它与 SICP(结构和解释)结合使用of Computer Programs,一本强烈推荐的书,另一个答案也建议)。

于 2012-07-13T12:29:36.420 回答
2

我想学习一门函数式语言以拓宽我的视野。我有 Python 和 C/C++ 方面的知识,并且我希望一种语言易于从来自命令式语言领域的人那里学习。我不在乎语言是否足够强大。我只想要一门语言来学习函数式编程的基础,然后我会尝试更难(和更强大的语言)。

好问题!

在 1990 年代后期开始进行函数式编程之前,我已经学习过 BASIC、Pascal、汇编程序、C 和 C++。然后我几乎同时开始使用两种函数式语言,Mathematica 和 OCaml,并在几年内完全使用它们。特别是,OCaml 让我可以编写看起来像我之前编写的代码的命令式代码。作为学习者,我发现这很有价值,因为它让我比较了不同的方法,这些方法使 ML 的优势显而易见。

然而,正如其他人所提到的,Mathematica 和 OCaml 的核心优势是模式匹配,这在技术上与函数式编程无关。我随后研究了许多其他函数式语言,但我不想回到缺乏模式匹配的语言。

于 2013-01-27T15:45:55.980 回答
1

没有讨论的一个元素是代数数据类型的特殊模式匹配语法的可用性,如在 Haskell、ML 的所有风格以及可能提到的其他几种语言中。模式匹配语法倾向于帮助程序员将其函数视为数学函数。Haskell 的语法足够复杂,并且它的实现具有足够差的解析错误消息,该语法是不选择 Haskell 的一个正当理由。Scheme 可能比大多数其他选项更容易学习(并且 Scheme 可能是所有宏系统的王者),但是缺少模式匹配语法会让我远离它来介绍函数式编程。

于 2012-07-15T02:17:00.713 回答
1

这个问题可能是题外话,因为它会导致无休止的语言战争,但这里有一个一般性的建议:

有一类函数式编程语言有时被称为“大部分函数式”,因为它们允许在您想要它们的地方使用一些命令式特性。示例包括标准 ML、OCaml、F# 和 Scala。如果您希望能够掌握功能性惯用风格,同时仍然能够以相当熟悉的方式实现目标,您可以考虑其中一种。

过去我曾广泛使用标准 ML,但如果您正在寻找学习曲线较少的东西,我个人会推荐 Scala,它是我第二喜欢的编程语言。其原因包括图书馆的普及、健康规模的社区以及可以帮助您入门的好书和教程的可用性(特别是如果您曾经与 Java 打过交道)。

于 2012-07-13T12:11:34.010 回答