F#vs Haskell vs Lisp - 要学习哪种语言?

时间:2010-02-10 12:24:45

标签: c# haskell f# lisp language-comparisons

我听过很多关于函数式编程语言的知识,我愿意学习它。我想这主要是为了好玩,但是,我希望它能提高我的编程技巧。

我主要是C#/ .NET背景,所以我的第一选择是学习F#(因为.NET和熟悉Visual Studio)。另一方面,我想知道F#是否具有Lisp宏或Haskell高阶函数等功能。

你能比较F#,Haskell和Lisp吗?哪一个将是您选择的语言?

9 个答案:

答案 0 :(得分:42)

F#是我的首选语言,但我强烈建议您学习它们。它们本身就是完全不同和有趣的。这里是每个人的快速浏览(可能有轻微的F#偏见),您可以通过Google搜索轻松找到更多信息:

F# - 是一种语言,可以轻松编写功能样式,让您轻松复制对象而不是改变它们。它还为您提供有趣的数据类型,如元组和代数数据类型,有用的语言结构,如模式匹配和列表推导。它还具有OO和命令功能以及对库的良好访问,因为您可以使用任何.NET框架组件。

Haskell - 是一种纯粹而懒惰的功能语言,是一种罕见甚至独特的野兽。这意味着根本没有任何副作用,除非它们被monad跟踪。 Haskel也有元组,代数数据和模式匹配。

Lisp - 而F#和Haskell是静态类型的,lisp是动态类型的。它具有独特的语法,它使用了大量的括号,并提供了一个有趣的宏功能,允许您对程序本身进行转换并扩展语法。

答案 1 :(得分:26)

我曾经有同样的问题

从那以后,我在F#中做了一些编程。现在我很高兴我做到了,因为在C#中理解LINQ真的很有帮助,而这恰好也是我的背景。 (因为我学习了F#,我几乎从不在C#中使用foreach)

我通过F#了解了很多关于延迟评估,列表和序列的事情,所有这些都可以选择任何语言,并且对列表,元组等有很好的支持(就像我猜的任何函数式语言一样),但是如果你选择F#,所有这些在C#中也非常有用。也许你已经知道所有这些东西并正确使用它,但如果你不这样做,请选择F#。

我开始here:一个非常好的视频教程,非常令人印象深刻,非常鼓舞人心的导师。

答案 2 :(得分:16)

目前我在第9频道观看有关功能编程基础知识的these视频。它是使用Haskell解释的,但基础知识适用于所有语言。我必须说它内容丰富且易于理解。

答案 3 :(得分:9)

实际上没有人回答这个具体问题:“我想知道F#是否具有Lisp宏或Haskell高阶函数等功能。”

F#不提供宏。此外,它不提供更高级的类型(这是我认为你首先要问的)。

F#确实提供了更高阶的函数,因为你可以轻松编写一个函数来获取函数并返回一个函数。实际上,C#(或实际上任何.NET语言)都可以这样做,因为Func委托是.NET框架的一部分。

答案 4 :(得分:8)

这是一个非常主观的问题。

我的观点是Scheme(一个Lisp变体)和阅读SICP是正确的。你会学到很多东西。

但是出于实际目的,如果您是.NET开发人员,那么F#可能会更好。

答案 5 :(得分:8)

我不知道F#,但有时我喜欢玩它。我的语言是Clojure,它非常实用,也适用于CLR,但JVM版本是主要版本。

你想要很多东西。对F#的主要不同之处在于Clojure是动态类型的,并且它有很好的方式处理可靠性(我会说最好的一种)。

顺便说一句。 您是否知道F#是因为Haskell难以在CLR上运行而制作的? (这不是故事的全部,而是它的一部分)

答案 6 :(得分:6)

为什么选择? 自己学习Lisp和Haskell。 没有必要在你自己的时间学习F#。如果你需要它来工作,你将在工作中学习它;)

编辑:这家伙正在寻找语言来学习乐趣。好吧,Lisp和Haskell是很好的候选人,因为有趣的是他们将被用于(那里没有带薪工作)。他“可能”(尽管不太可能)有机会在工作中使用F#(他在MS商店),所以为什么在空闲时间学习一些东西可以在工作时学习它。

答案 7 :(得分:5)

我将它们全部学到了不同的程度,并建议从Scheme(Lisp方言)开始 - 只是因为它最容易学习。 Haskell和F#是静态类型的,这对于现实生活中的项目来说是一个很大的优势,但是恕我直言他们有一点“太多”的语法,并不像Scheme那样容易接受。

.NET有一个很好的Scheme实现 - IronScheme。您可以查看我的文章“Playing with IronScheme”,看看您是否喜欢它。

答案 8 :(得分:4)

如果我们比较这三种语言,我会推荐Haskell。它比LISP更实用(因为它是类型系统),比F#更强大,更聪明。据你所知,F#是OCaml的.NET端口,并且在某种程度上它不像Haskell那样是非常清晰的,或者是OCaml。我建议你学习Haskell或OCaml来了解F#是多么不方便。