有没有人有任何关于开始函数式编程的建议?

时间:2009-01-11 03:22:15

标签: haskell f# functional-programming lisp

我正在寻找一些可以帮助我学习函数式编程的电子书。我还没有决定使用哪种语言,但我注意到在StackOverflow社区中对LISP,Haskell和F#有相当大的偏见。到目前为止,我不确定我将采取哪个方向,但任何人都可以推荐有关该主题的特定电子书吗?此外,如果有人能够提出一个令人信服的论证,哪种函数语言最有意义,我最感兴趣的是听取你的意见。

我对电子书特别感兴趣,因为我设法为圣诞节索取了一本索尼电子书阅读器,我希望用有用的材料加载它,这是我永无止境的追求成为更好的程序员。

19 个答案:

答案 0 :(得分:49)

我建议Haskell。请查看其他问题:Getting Started with Haskell

支持Haskell的原因:

  • 首先从个人的角度来看:我花了相当多的早期编程时间考虑设计自己的编程语言。 (例如,我强烈推荐教科书Programming Language Pragmatics。)当我第一次遇到Haskell时,我意识到它融合了我所拥有的许多想法,加上更多的想法,而且所有想法都比我自己做得更好
  • 这是一个非常纯粹的功能理想实现:懒惰(非严格)和(多态)静态类型。没有副作用!
  • 其类型系统可能会更改您对类型系统的看法。 (Hindley-Milner型推断令人惊叹。)
  • 它面向对象编程和多态的另类观点很棒。

Lisp也是一个不错的选择。支持Lisp变体的原因:

  • 历史上第一种函数式编程语言(或第一种巨大的编程语言)。
  • 世界观“一切都是一个清单”非常简约,简洁,美观。

如果你确实选择了Lisp变体,我推荐Scheme

我没有使用OCaml或Ruby,但我的一些朋友发誓他们,尽管有人可能会说他们有多么功能。另一方面,他们的“多范式”性质使他们在实践中非常方便。

总而言之,我建议你按照Alan Perlis的建议选择一种语言:“一种不影响编程方式的语言,不值得了解。” Lisp和Haskell都改变了我的世界。我希望无论你选择什么语言,它都会改变你的世界。

答案 1 :(得分:27)

我刚刚开始关注Structure and Interpretation of Computer Programs视频讲座,我觉得它们很精彩。他们采用Scheme作为编程语言,它是LISP的一种变体。但这不是课程的重点:它涉及“计算”的整个概念及其含义。

答案 2 :(得分:15)

函数式编程的最佳教程之一(朋友给了我)是Learn You a Haskell for Great Good!。本教程是关于Haskell的,但其中的基础知识非常好,以正确的顺序呈现。我发现它很清楚。

答案 3 :(得分:8)

显然,这取决于。

您熟悉C#和.Net框架吗?如果是这样,那将使用F#开始。如果你有Visual Studio,你也可以玩F#,这样就可以平息另一个学习曲线。

这也取决于你是否只是想要'grok'功能编程来拓宽视野,或者实际使用它。如果您只是想要开始,那么从任何地方开始,但如果您打算使用它,那么选择与您当前框架兼容的东西。

我的2美分/便士

答案 4 :(得分:7)

我正在阅读Yet Another Haskell Tutorial的中间,这是一本非常有用且写得很好的Haskell书。

答案 5 :(得分:7)

如果你有兴趣潜入Lisp,那么

Practical, Common Lisp是一本很棒的电子书。它与许多语言完全不同,但我觉得自己想要学习它是我编程生涯中最有价值的经历之一。有限的语法使得语言非常灵活,相对容易学习,但从概念上讲,需要一些时间来思考。

答案 6 :(得分:7)

也许有一个选项是下载整个在线版Real World Haskell

这是一本学习Haskell的好书,但可以说它可能需要与一本关于函数式编程的更一般的书配对。

答案 7 :(得分:4)

我会从Lisp(特别是Scheme)开始,因为它很简单;它有一个非常简单的语法,无需担心静态类型系统。

Structure and Interpretation of Computer Programs不仅会向您介绍Scheme,还会教您所有主要的编程范例。全文可在知识共享许可下获得。

之后,您将更容易学习Haskell的其他功能,即更精细的语法,懒惰的评估和强大的类型系统。

答案 8 :(得分:4)

我会推荐任何一种语言的ML(标准ML或OCaml都很好)方言。

他们对Haskell产生了巨大的影响,并且比Haskell对FP的介绍更为温和。

答案 9 :(得分:3)

我跳你选择了Erlang或Lisp。 (第四)在那里你有我所知道的最令人兴奋的语言。

我应该去Erlang,Lisp和Forth,请发表评论。

答案 10 :(得分:3)

“如何设计程序”:http://www.htdp.org/

顺便问一下,你的目标是什么?

答案 11 :(得分:3)

我会选择“Clojure的喜悦”。

我认为你已经了解Java。 Clojure在JVM上运行,纯粹是功能性的(有一些例外可以促进并发编程)并且是一个lisp。它具有上面提到的lisps的所有优点(呃...从不介意尾调用优化),具有一些巨大的优势,如与Java的兼容性,高级持久数据结构和一个庞大而充满活力的社区。如果你想学习一些你可能有一天有机会专业工作的东西,可以选择Clojure(或F#,如果你能戒掉.net)。

http://www.manning.com/fogus/

答案 12 :(得分:2)

我绝不是这方面的专家,但我个人认为从方案开始可能是一个好主意。据我所知,方案是LISP的简化版本,将其视为LISP,但只包含基本要素。我认为scheme的语法非常纯粹,你必须超越括号,但它确实帮助我进入函数式编程的'感觉',而不必学习语言特性。

答案 13 :(得分:2)

我可能会因此而被投票,但我说要选择Ruby。它是一种非常漂亮和现代的混合功能OO语言,它将温和地向您介绍函数式编程的世界。或者任何其他具有闭包和高阶函数的语言(它必须是动态类型或类型推断,否则编写功能代码真的很难)。

一旦你对Ruby FP感到满意,或者你不想听我最好的建议,试试像Scheme这样的东西。这是一种优雅而温和的语言。

如果你从Common Lisp或Ocaml或Erlang或尤其是Haskell开始,你很可能会因为不同的原因而感到害怕而你会感到迷茫。如果你对Scheme感到满意,你可能想尝试这些,但我真的建议不要从它们开始。很少有人走这么远的路。

答案 14 :(得分:1)

两本好书:

“计算机程序的结构和解释”(Abelson& Sussman)和 “计算机编程的概念,技术和模型”(作者Peter Van Roy和Seif Haridi)。

两者都只涵盖功能性编程。

答案 15 :(得分:1)

我将第二个真实世界Haskell并添加:“Haskell: The Craft of Functional Programming”。

答案 16 :(得分:1)

我确实在A taste of Haskell找到了价值。这是Simon Peyton Jones的一次演讲。这是一个非常好的概述,首先看一下针对非FP程序员的语言。

Part 2 of the talka PDF of the slides。相机从不显示幻灯片,因此PDF确实有帮助。

答案 17 :(得分:0)

Lisps是唯一一个在核心和定义明确的标准(在CL和Scheme的情况下)具有常规语法的Lisps。 他们弥补了一个启发性的旅程。

我推荐Common Lisp。

有很好的免费初学者书籍,请查看Lamkins的“成功Lisp”和Seibel的“Practical Common Lisp”:

答案 18 :(得分:0)

对于命令式编程的过渡,我建议Chris Smith Programing F#。 第二章A. Rex评论上面关于Haskell resources和其他成员关于SICP