我最近读了很多关于函数式编程语言的帖子(事实上,几乎在过去的一年里)。我真的很想选一个并彻底学习它。

上个[课程]学期,我接触到了Scheme。我爱它。喜欢极其简单的语法, 同形性 原则上,宏(卫生的 和不卫生)、程序的数量等。

Scheme 的问题在于它是一种学术语言。我认为它并没有真正用于生产环境。我也不认为把它写在我们的简历上有什么特别的好处。所以,我一直在寻找替代方案。它们有很多,而且不知怎的,它们似乎都有相似的受欢迎程度。

关于我还考虑过的其他一些函数式语言的一些想法:

  • 克洛朱尔:听起来很棒,因为它可以访问 Java 世界,它面向可扩展性和并发性,但 Java 世界现在不是处于边缘吗?我已经非常了解 Java,但是在 JVM 上添加更多精力是否明智?
  • 哈斯克尔:看起来是一种非常受赞赏的语言,但从我所读到的来看,它更像是一种学术语言。
  • 口齿不清:它从古至今一直存在。它似乎拥有我在Scheme 中喜欢的大部分内容。它有一个很大的社区。据我[认为我]所知,它可能是工业中使用最广泛的函数式编程语言(?)。
  • F#:并没有真正考虑过。我不太喜欢 MS 的东西。我没有钱购买他们的软件(我可以让它们脱离大学联盟,但我更倾向于使用社区驱动的解决方案)。尽管...我想这将是最好的职业选择。

今晚,我倾向于 Lisp。一周前,是 Haskell。在此之前是 Clojure。在过去的一年里,我只是为了好玩而做一些计划,而不是为了你知道的原因而推动它。现在我想认真对待(关于学习一个,关于用它做真正的项目,关于也许最终专业地使用它)。我的问题是我需要深入学习它们才能选择其中之一。

有帮助吗?

解决方案

因为你想要一个 实际的 语:

alt text

请注意,尽管最近对Clojure和F#引起了人们的兴趣,但Haskell和Lisp比行业中的其他人使用更多。

但是,当我们将方案添加到混音中时会发生什么:

alt text

嗯,看起来现在不像一种学术语言,是吗?

实际上,上图可能是谎言。除了编程语言外,在其他情况下,“方案”一词可以出现在其他情况下。 :)

因此,这是另一个可能(一点)代表的图:

alt text

如果您想探索一个真正的踢屁股方言,请看一下 球拍。

其他提示

如果您想学习功能编程,最好先学习Haskell,然后使用任何想要的语言。您可以使用其他语言学习功能编程,但是它们仍然允许命令和面向对象的代码。如果您在Haskell中编写一个真实的程序,则您将更快地学习功能编程,因为其他范式将无法恢复。

在编写了Haskell程序之后,您将拥有Monads和Techniquer等工具,例如无点编码,以带上您选择的语言。这些概念似乎特别适合方案。

实际上,如果您能够在方案中实现一个合理的复杂系统,那么您可能会在您可能想工作的公司中相当理想。在我的职业生涯的早期结构和算法在合理的时间内。我总是让候选人用他们的首选语言回答这样的问题;我确实遇到了一些人,他们认为他们最适合计划,他们设法与应该很容易的事情挣扎,例如将元素添加到链接列表中,这使我感到惊讶。

但是,如果您能够很好地“获得”计划即使编写一个普通的Web应用程序,那么在大多数严重的软件公司中,这将是一个很好的卖点。

如果您在“ Blub”商店采访,而开发人员只是以为您在计划或Haskell或F#上的熟练程度很奇怪,那么您可能不想在那里工作。在大多数情况下,有能力的开发人员可以选择演出,因此,除非您将来能想象的唯一选择是公司,否则不要出汗“实用性”。致力于胜任,灵活和分解问题。

大学不是实用性。这是关于创建一个安全的环境来探索和学习。实际上,即使您最终在职业生涯的其余部分都写了普通的软件,也很有用。

话虽这么说,我不明白您为什么要这么快限制其中一种选择。您可以在大约4周内轻松了解所有四种语言,然后选择一种以与当前的异想天开的方式专注于该语言。然后返回您的另一个选项,然后尝试实现类似的东西。继续进行更复杂的事情,然后再次考虑您的选择。实验很好。除非您想下个月谋生,否则您还不需要成为专家。

我已经写了一些方案,F#,Emacs LISP和Common LISP,并且至少在过去几年中读了一点Haskell。我不能说我是其中任何一个的专家,但是每次访问这些语言都使我受益于我在专业工作的所有其他语言中受益(C#,Java,Ruby,以及Boo,Perl和Python)。好奇心将为您带来比其他任何事情都更加持久,充实的职业。

我愿意进入Haskell一段时间,但是我得出的结论是,这太过学术了。很难做任何实用的事情。用纯粹的功能性语言,诸如IO之类的东西只是不太适合模型,因此您必须处理Monads。我确定我将不得不花大量时间才能胜任,所以我继续前进。

我在大学里做了计划。听起来可能很琐碎,但所有的帕伦斯都真的很分散/烦人。在使用Python之后,很难回到这一点。

最近,我一直在探索F#。它是功能性的,但是当您想要时,也可以是势在必行的和面向对象的。这可以使用任何.NET库,使您可以轻松地将纯功能零件与GUIS,IO和网络等更实用的东西混合在一起。您可以获得F#的独立版本。

http://www.microsoft.com/downloads/en/details.aspx?familyid = effc5bc4-c3df-4172-ad1c-bc62935861c5&displaylang = en

我在一两年前从想要一种实用的、通用的函数式编程语言的角度评估了所有主要的函数式语言。

我最终选择了 克洛尤尔, ,后来证明这是一个很好的选择。

总的来说,主要原因是:

  • 图书馆生态系统 - 要使语言有用,您需要访问良好的库。使用 JVM 意味着您可以轻松访问最大的开源库和工具生态系统,因此从实用的角度来看,选择 JVM 语言是理所当然的。Scala 在这里也获得了很高的分数。

  • 宏元编程 - Lisp 的这一方面总是吸引我,特别是因为我预计要生成大量代码。我非常欣赏保罗·格雷厄姆短文中提出的论点“击败平均水平”。各种 Lisp 在这里都取得了强劲的成绩。

  • 表现 “足够好”——Clojure 总是被编译并获得 JVM JIT 优化器和出色的 GC 的好处。与往常一样,使用函数式语言会产生一些开销,但使用 Clojure 很明显,您只需付出一点努力就可以接近 Java 的速度(Clojure 支持 Java 原语和可选的静态类型,适合您需要的情况)。我的估计是,Clojure 大约比使用优化的 Java 或 C++ 代码实现的速度慢 2-5 倍,这与您在 有缺陷的基准, ,随着时间的推移,我预计这种差距会进一步缩小。此外,只需用纯 Java 编写对性能特别敏感的代码并从 Clojure 调用它就足够容易了。

  • 并发性 - Clojure 有一种相当独特且强大的并发方法,特别是对于高度多核并发。有点难以解释,但是 这个视频很棒 来体验一下这些原则。我认为 Clojure 目前对“如何在函数式编程语言中管理共享、并发和可变状态?”这一棘手问题提供了最佳答案。

  • 语言设计 - Clojure 在我看来是一种经过深思熟虑的语言设计。示例包括除了常规 Lisp 括号之外还具有向量 [] 和 map {} 文字、使用不可变的持久数据结构、通过序列抽象支持整个语言的惰性,以及为程序员提供各种正交功能来解决不同的问题。看 抽象艺术简单变得容易.

  • 社区 - 总是主观的,但我喜欢我在 Clojure 社区看到的东西。这种态度非常有帮助、有建设性且务实。强烈强调“把事情做好”,这可能反映出许多 Clo​​jure 人员(包括 Rich Hickey 本人)都具有构建复杂企业系统的背景。Clojure 社区与 Java 社区也有着密切的联系,这一事实让我相信 Clojure 不会冒着陷入“利基市场”的风险。

如果我必须说出 Clojure 的几个小缺点,这些是:

  • 动态类型 - 通常这在生产力方面是一个优势,但平均而言,我认为我会用它来换取更强的类型检查和推理。大多数情况下,通过拥有一个良好的自动化测试套件可以缓解这个问题,但如果您喜欢由编译器静态验证您的类型,那么 Haskell 或 Scala 可能更适合您。

  • 前沿 - Clojure 的发展速度非常快,并且有很多创新正在进行 - 这样做的缺点是需要进行大量的实验,一些库和工具仍然不成熟,并且 Clojure 主要版本之间偶尔会出现需要更改的重大更改密切关注。

总的来说,如果您想要一种优秀且实用的现代函数式语言,我认为 Clojure 不会出错!

看起来您已经完成了作业,因此您可能已经知道这一点,但是方案是LISP的方言,就像普通LISP一样。如果您喜欢有关计划的很多事情,但不喜欢它的学术性质,请尝试常见的LISP。根据 TIOBE索引, ,这是第26位最受欢迎的语言方案。

您提到的很少的语言出现在我最近看过的作业描述上,尽管这可能只是我的小样本集。我个人将学习Haskell,即使我不希望直接在工作中使用该语言。功能编程的概念对于我将来的计划设计比语言本身的直接销售性更有价值。

许可以下: CC-BY-SA归因
scroll top