14

情况就是这样:我主要编写 C# 并在其中编写了我不想丢失的类型。同时我想学习函数式编程。显而易见的答案当然是 F#。

但是对于除了 C# 之外的所有内容,我都使用 emacs 作为编辑器,而且我也很想学习 Lisp。(学习你知道的编辑器/IDE 的语言,这就是为什么我会一点 VB 来编写我的 VS 宏)而且它不仅仅是 emacs,Lisp 是我真正想学习的东西。

至于 F#,我可以将它与 C# 混合,而不会出现任何互操作问题,拥有出色的 GUI (WPF) 和许多其他 .NET 好东西。但它当然不如 Lisp 成熟。

如果我是现实的,我知道如果我想在我的职业生涯中走私一种功能语言,它必须是 F#。由于学习两种完整的语言似乎有点多,我希望 Lisp 会是学习函数式编程的好方法,如果我以后开始 F#,那会很容易......

这是真的?还是这两种语言根本没有可比性?

4

9 回答 9

15

Lisp 是一大类语言和实现。例如,Scheme 是一种 Lisp 方言,可能有超过一百个实现(其中大约十个比较流行)。Common Lisp 是另一种方言,目前维护了大约十个实现。Scheme 和 Common Lisp 都有实现尝试实现的书面标准。

F# 既是一种语言,也是一种实现。来自微软。它主要源自 OCAML,属于 ML 语言家族。

Lisp 是一种非常早期的支持函数式编程的语言(60 年代的 Lisp 1.5)。许多早期的函数式编程实验都是在 Lisp 中完成的。在 70 年代,Lisp 社区发生了一场向函数式编程根源的运动,结果就是Scheme。然后特别是在上世纪 80 年代和 90 年代出现了与通常的 Lisp 方言完全不同的新功能语言(ML、Miranda、FP、SML、Haskell、Clean ......)。仍然有一些遗产,但主要是朝不同的方向发展(静态类型、类型推断、模块系统、批处理语言、代数数据类型、惰性求值、纯度等)。Scheme 社区仍然与 FP 社区有很多联系。但这主要是它。

有一些基本的 FP 思想可以独立于特定的 FP 语言学习,但通常 F# 与大多数 Lisp 方言有很大不同。另一个功能,即 F# 支持 .net 生态系统(特别是因为它是 Microsoft 创建的)并没有得到 Lisp 方言的很好支持。

我也不期望通过了解像 Emacs Lisp 这样的受限 Lisp 方言来学习 F# 有太多好处。

于 2009-06-23T19:16:49.760 回答
10

我认为你通过 Common Lisp 和 F# 学到的东西只有很小的“重叠”。共同点是我大致认为

  • 使用“cons-lists”作为常见的基本数据类型进行编程,有时编写递归(尤其是尾递归)函数而不是循环
  • 常见高阶函数的一些基本用途(例如“map”——将函数应用于列表中的每个值)

除了一些非常核心的函数式编程内容之外,我认为 Common Lisp 和 F# 彼此之间的距离与两种主流的“函数式”(非 Haskell)语言的距离差不多。Common Lisp 是动态的;F# 是静态类型的。句法形式完全不同。运行时完全不同。图书馆非常不同。对象系统完全不同。

无论您以哪种顺序学习它们,我认为在学习了一种之后,在另一种中仍然需要学习更多内容(以我上面描述的小重叠为模)。

于 2009-06-23T18:16:34.813 回答
5

F# 最可与 ML 语言家族相媲美,例如 SML 和 CAML。语法和功能与 Lisp 不同。

但我认为从计算机科学的角度来看,学习至少一种功能语言非常重要。能有这样的想法就好了。

而且,我想说,在开始 F# 之前学习一门更纯粹的函数式语言将是培养良好函数式编程习惯的一种方式,因为如果你不这样做,你的 F# 代码最终可能会变得更加面向对象而功能更少,因为那是你来自。

于 2009-06-23T16:22:27.783 回答
5

在我看来,学习函数式编程有两种方法:

  1. 使用更纯粹的函数式语言,如 Scheme (a Lisp) 或 Haskell,这将迫使你立即打破程序思维;或者

  2. 使用像 F# 这样的实用函数式语言,它还提供了更熟悉但功能更少的构造,以帮助您轻松进入它。

在任何一种情况下,如果您可以使用该语言做一些有用的事情,您将从学习体验中获得更多收益。听起来你对 Lisp (Emacs) 和 F# (.NET interop) 很有兴趣,所以我会看看两者,看看是什么吸引了你的注意力。

最终,理解函数式编程概念(高阶函数、无副作用、尾递归等)比任何一种语言都更有价值。一旦你学习了这些概念,学习新语言并将技术应用到其他语言(比如功能越来越强大的 C#)中就会容易得多。沿着这些思路,您可能会对真实世界的函数式编程感兴趣。

于 2009-06-23T18:09:46.370 回答
3

需要考虑的两个重要事项是:

  • LISP 是动态类型的,而 F# 是静态类型的。
  • LISP 内置了宏。F# 没有。

尽管它们都被认为是功能性的并且具有许多共同的特征,但它们也是不同的。学习 LISP 肯定会让你成为一个更好的 F# 程序员,反之亦然,但你仍然必须学习两者的特性才能在它们中实用。

为了能够与 .NET 互操作,我当然会选择 F#,但为了编程美感,我也会尝试 LISP。

于 2009-06-23T17:40:58.863 回答
2

它们都是函数式语言,但在语法上它们非常不同。这意味着许多概念将是相似的,并且您(作为程序开发人员)将不得不做同样的思考才能使用它们,但它们是非常不同的语言。

F# 是ML的派生词(与它的所有派生词一起被认为是一种不纯的函数式语言),而Lisp更老,被认为是一种“纯”函数式语言。

函数式语言的纯度是一个引人入胜的话题,我建议您阅读语言纯度和脏函数和清洁函数以更好地理解这个概念:

许多人谈论“纯”函数式语言,其中“纯”似乎是“好”的同义词。有两个特征通常与纯函数式语言的定义相关:

  1. 函数不能有副作用
  2. 使用任何给定参数调用的函数将始终返回相同的值。
于 2009-06-23T16:16:15.533 回答
2

我只是 F# 的新手,但我在 F# 之前学习了 Lisp,并且相信它对于在 .NET 框架和编程语言的范围内将 F# 上下文化非常有帮助。

我衷心建议至少在这里观看前几个视频:

http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/

这些会在第一个小时内教你 Lisp 的基础知识。该系列建立在这些知识的基础上,并灌输了从那里得出的令人兴奋的原则。

于 2009-06-30T12:13:49.673 回答
1

F# 和 Scheme 的语义非常相似,但强类型除外。

还有,Scheme那么小​​,不学吧!

于 2009-06-30T12:24:18.467 回答
0

作为一种编程语言,Lisp 本身就非常特别,但它与 F# 一点也不相似,只是它们都支持函数式编程。没有多少语言结构从 Lisp 延续到 F#。如果你想学习 lisp,那就去吧。函数式编程的想法将延续而不是语法。Lisp 真的很老了,50 年代末。许多语言都受其影响,方言也不少。

如果您只是想在 F# 之前学习一种纯函数式语言,我建议您使用 Haskell。Haskell 深受 ML 的影响,是一种向 F# 过渡的良好语言,因为 F# 是 ML 的衍生语言。您可以查看 Haskell 代码并在 F# 代码中看到类似的模式。

于 2009-06-23T16:58:56.433 回答