【问题标题】:How is Lisp related to F#, and is learning Lisp a useful leg up to F#?Lisp 与 F# 有什么关系,学习 Lisp 对 F# 有帮助吗?
【发布时间】:2010-11-05 05:38:43
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: programming-languages f# lisp compare-contrast


    【解决方案1】:

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

    F# 既是一种语言,也是一种实现。来自 Microsoft。它主要源自 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# 有太多好处。

    【讨论】:

    • @Thorbjørn Ravn Andersen:“Lisp”是一种非常早期的语言,基于 McCarthy 周围的团队所设计的。后来它不再是一种语言,因为它变成了一个相关语言和方言的家族。不再有单一的“Lisp”语言了。早期的 Lisp 现在已成为历史,我们有不同的语言,如 Scheme、Common Lisp、Clojure、Logo,...
    【解决方案2】:

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

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

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

    不管你学习它们的顺序是什么,我认为在学习了一个之后,在另一个学习中仍然会有很多东西需要学习(以我上面描述的小重叠为模)。

    【讨论】:

      【解决方案3】:

      F# 与 ML 语言家族(例如 SML 和 CAML)最具有可比性。语法和功能与 Lisp 不同。

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

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

      【讨论】:

      • F# 不仅可以与 ML 相提并论——它还是它的衍生品。
      【解决方案4】:

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

      1. 使用更纯粹的函数式语言 像 Scheme (a Lisp) 或 Haskell 那样会强制 你打破程序 马上心态;或

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

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

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

      【讨论】:

      • 你可能会感兴趣 --> 我是的,tx。此外,我认为我会选择突破性场景并从 Lisp 开始
      • 链接的书很有帮助。
      • 将 Common Lisp 称为“函数式语言”是完全错误的。你可以做任何你想做的事,甚至是你自己的脚,Common Lisp 的“惯用”编程方式不是功能性的,而是“实用的”,即如果你愿意,你就可以变异,如果你愿意,你可以不变异 - 情境选择和决定。那些只说“Lisp”的人不应该暗示任何 Lisp 都像 Scheme 那样工作,后者在其横幅上写了“功能性”。
      【解决方案5】:

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

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

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

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

      【讨论】:

        【解决方案6】:

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

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

        函数式语言的纯度是一个引人入胜的话题,我建议您阅读Language Purity and Dirty and Clean Functions 以更好地理解这个概念:

        很多人都说“纯” 函数式语言,其中“纯” 似乎是“好”的代名词。 一般有两个特点 与 a 的定义相关联 纯函数式语言:

        1. 函数不能有副作用
        2. 使用任何给定参数调用的函数将始终返回相同的 价值。

        【讨论】:

        • 现代的 Lisp 实现并不是纯函数式的,尽管你可以轻松编写纯函数式程序。
        • Lisp 方言通常不是纯函数式语言。
        • 也没有什么能阻止你以纯粹的风格编写 F#。
        【解决方案7】:

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

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

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

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

        【讨论】:

          【解决方案8】:

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

          还有,Scheme太小了,不学了!

          【讨论】:

            【解决方案9】:

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

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

            【讨论】:

            • Haskell 与任何机器学习方言都大不相同。
            • 从方言中是的,但是“Haskell 的许多功能起源于 ML,并且这些语言具有非常相似的“外观”。 - 取自haskell.org/haskell-history.html
            • 基本上FP社区被划分为默认使用哪种评估机制。 Haskell 是非严格的,而 ML 家族是严格的。这有很大的不同。 Haskell 是标准的非严格语言。第二个 Haskell 是“纯粹的”(没有副作用),并且大量使用了诸如 monad 之类的结构。 ML 方言通常不纯。这些语言家族的核心差异使它们的使用方式大不相同。
            猜你喜欢
            • 1970-01-01
            • 2010-09-12
            • 2010-12-09
            • 2011-01-08
            • 2012-06-29
            • 1970-01-01
            • 1970-01-01
            • 2010-09-28
            • 1970-01-01
            相关资源
            最近更新 更多