F# vs Haskell vs Lisp - 哪种语言更值得学习?(涉及IT技术)

45
我听说过函数式编程语言,想学一门。虽然主要是出于兴趣,但我希望这会提高我的编程技能。
我主要使用C#/.NET,所以我的首选是学习F#(因为它在.NET和Visual Studio上很熟悉)。另一方面,我想知道F#是否有像Lisp宏或Haskell高阶函数这样的功能。
你能比较一下F#、Haskell和Lisp吗?哪一个将是你的首选语言?

2
非常主观的问题。但是我会回答。Lisp,因为它是函数式语言之父。但说真的,如果你能编写Lisp程序,你也可以在Scheme(我会选择Scheme而不是F#)和Haskell中工作。 - bdd
2
如果你正在考虑使用Lisp,你需要将其缩小到特定的方言:https://dev59.com/oHI95IYBdhLWcg3w3iDG - Justin Ethier
2
如果您正在考虑使用F#,那么您可能会对我的《真实世界的函数式编程》一书感兴趣(http://www.manning.com/petricek)。这本书是为C#开发人员编写的,它还演示了如何在C#中使用函数式技术(实际上,您可能已经在使用其中的一些!)学习F#可能会更容易,但Haskell或Lisp以更清晰的形式展示了其中的一些思想。 - Tomas Petricek
1
社区维基?主观标签?!! - Michael Easter
1
@Paperino:实际上,我认为Scheme比Haskell更宽容。因此,如果您能够编写Haskell程序,那么您可以在Scheme或其他LISP方言中工作。 - Vlad the Impala
显示剩余4条评论
9个回答

46

F#是我选择的语言,但我强烈建议您学习所有这些语言。它们都有自己不同和有趣的特点。以下是每种语言的简要概述(可能有点F#偏见),您可以通过谷歌搜索轻松找到更多信息:

F# - 是一种易于采用函数式编程风格的语言,让您可以轻松地复制对象而不是改变它们。它还提供了有趣的数据类型,如元组和代数数据类型,以及有用的语言构造,例如模式匹配和列表解析。它还具有面向对象和命令式特性,并且由于您可以使用任何.NET框架组件,因此可以方便地访问库。

Haskell - 是一种纯粹的惰性函数式语言,是一种罕见甚至独特的生物。这意味着除非它们被monad跟踪,否则根本没有副作用。Haskell也有元组、代数数据和模式匹配。

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


8
在 Haskell 中,除了 monad 之外,还有其他跟踪副作用的方式,例如 arrows 和 applicatives。 - Martijn

29

我曾经也有同样的问题。

自那以后,我在F#中进行了一些编程。现在我非常高兴我这样做了,因为理解C#中的LINQ非常有帮助,而且那也是我的背景。(自从我学会了F#,我几乎不再使用C#中的foreach)

通过F#,我学到了很多关于惰性评估、列表和序列的东西,所有这些你可以选择任何具有良好列表、元组支持的语言(像任何函数语言一样),但如果你选择F#,所有这些都将在C#中非常有用。也许您已经知道并正确使用所有这些东西,但以防万一,选择F#。

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


那个视频是介绍 F# 强大功能的绝佳入门材料。 - eric.christensen
1
我有一个非常类似的经历,我在2008年读过《期望F#》,但当时只稍微练习了一下这种语言,但我将学到的概念成功地应用于我的C#日常工作中,这反过来又强化了我最近在实践中学习F#的努力! - Stephen Swensen

18

目前我正在观看Channel 9上关于函数式编程基础的这些视频。虽然使用的是Haskell进行解释,但这些基础知识适用于所有编程语言。我必须说这非常有益并且易于理解。


3
我认为 Erik Meijer 用 Haskell 而不是 F# 来教授函数式编程有其原因。Haskell 有一些特性(如无副作用)只有它支持。因此,对 Haskell 给予+1 的评价。 - mrsteve

8

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

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

但从实际角度考虑,如果你是.NET开发人员,那么F#可能更好。


2
对于JVM开发者来说,还有Clojure(Lisp)这个选择。 - sastanin
1
Scheme和SICP的问题在于缺乏类型编程。如果没有这方面的知识,您将无法让F#类型系统为您工作。 - J D
以及Clojure对于.NET开发者 - Hendekagon

8
我不了解 F#,但有时我喜欢玩它。我的语言是 Clojure,非常函数化,并且也在 CLR 上工作,但 JVM 版本是主要版本。
它为您提供了很多所需的东西。与 F# 的主要区别在于 Clojure 是动态类型的,并且它具有处理并发的非常好的方式(我会说这是最好的之一)。
顺便说一下。 你知道 F# 是因为 Haskell 在 CLR 上运行太困难而被创造出来的吗? (当然,这不是全部故事,但它是其中的一部分)

你有关于在CLR上运行Haskell的历史记录链接吗?那非常有趣。 - Justin
我记不清了,但我确定Simon Python Jones在一些视频中谈到过它。 - nickik

8
没有人真正回答了这个具体的问题:“我想知道F#是否有像Lisp宏或Haskell高阶函数这样的特性。”
F#不提供宏。此外,它也不提供高阶类型(这是我一开始认为你在问什么)。
F#确实提供了高阶函数,因为你可以轻松地编写一个接受函数并返回函数的函数。事实上,C#(或任何.NET语言)都可以做到这一点,因为Func委托是.NET框架的一部分。

F#用户社区提出了一个关于宏的建议,希望能够得到支持:[链接](http://fslang.uservoice.com/forums/245727-f-language/suggestions/5674940)(如果您感兴趣,请不要忘记投票!可以通过Google / Facebook快速登录)。 - MasterMastic

7
为什么选择? 自学Lisp和Haskell是有好处的。 但是没有必要在业余时间学习F#。如果需要工作,你会在工作中学到它的;) 编辑:这个人正在寻找一门有趣的编程语言来学习。那么Lisp和Haskell是很好的选择,因为它们只用于娱乐(没有付费工作)。虽然不太可能,但他“可能”在工作中有机会使用F#(因为他在微软公司),所以为什么在空闲时间学习一些东西呢?他可以在工作中学习并得到报酬。

3
“独自学习 F# 没有意义”,什么? - Bruno Reis
3
没有工作?有人应该告诉http://lispjobs.wordpress.com/,这样他们就可以关闭网站了。 ;) (原文已经很通俗易懂,我只需将其翻译成中文并保持原意即可) - mipadi
4
好的,如果他们每两个月发布两个新职位,那么他们真的应该关闭网站 ;) - Marko
1
F#没有进入TIOBE排行榜的前50名,而LISP排名第13。 - Marcel Valdez Orozco
1
这让我感到难过...我认为业界错过了Haskell..有时候我想开自己的公司,只是为了能够强制软件工程师学习Haskell!因为它们只用于娱乐(没有付费工作),所以Haskell是很好的选择。 - poy

5
我学过所有这些编程语言,并建议从Scheme(一种Lisp方言)开始学习,因为它最容易学习。Haskell和F#是静态类型的,这对于实际项目是很大的优势,但在我看来它们有点“过度”使用语法,不如Scheme容易上手。
.NET有一个不错的Scheme实现 - IronScheme。您可以查看我的文章“Playing with IronScheme”以了解更多信息。Playing with IronScheme

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

我听说 F# 诞生的原因是因为 Haskell 的类型系统过于复杂,无法移植到 .NET 平台。 - jpaugh
他们将一些OCaml功能移植到了.NET,但没有将一些难以移植到.NET的OCaml功能移植过来。这是否使F#比OCaml更好?我不这么认为。如果某些功能无法在某个地方移植,这并不意味着它们没有用处。这让我想起了一个关于Java程序员的笑话,他们认为“Java中没有lambda表达式,所以它们是无用的”。 - Kakadu
我实际上是在暗示 Haskell 比 F# 更好。但我还没有尝试过 F#,所以这个评价只能供参考。 - jpaugh

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