【问题标题】:If you already know LISP, why would you also want to learn F#?如果您已经了解 LISP,为什么还要学习 F#?
【发布时间】:2010-09-12 17:03:57
【问题描述】:

当您已经熟悉 LISP 时,学习 F# 的附加价值是什么?

【问题讨论】:

    标签: f# functional-programming lisp


    【解决方案1】:

    其中很多是编程语言世界中相对较新的发展。这是您将在 F# 中看到的,而在 Lisp,尤其是 Common Lisp 中不会看到的东西,因为 F# 标准仍在开发中。结果,你会发现有很多东西要学。当然,像 ADT、模式匹配、monad 和 currying 之类的东西可以在 Lisp 中构建为一个库,但学习如何在方便内置的语言中使用它们会更好。

    学习 F# 以供实际使用的最大优势在于它与 .NET 的集成。

    【讨论】:

    • CL 具有代数数据类型、可扩展的模式匹配和一元编程。它也有柯里化(语法不太好)。所以它缺少的是: * 静态类型 * .NET 支持 * 使用基础语言而不是扩展来提供所有功能 * “不错”的语法
    • “代数数据类型,可扩展模式匹配”。考虑一个 ADT type Expr = Num of float | Var of string | Add of Expr * Expr | Mul of Expr * Expr,其具有模式匹配的函数,例如区分Expr 类型的值。我不知道 CL 中的等价物,除非您使用 Qi 之类的东西,在这种情况下,您是 Greenspunning F#。
    • @Nathan:类型推断和类型提供者是其他原因。
    【解决方案2】:

    将 Lisp 直接与 F# 进行比较并不公平,因为归根结底,如果有足够的时间,您可以用任何一种语言编写相同的应用程序。

    但是,您应该学习 F#,原因与 C# 或 Java 开发人员应该学习 F# 的原因相同 - 因为它允许在 .NET 平台上进行函数式编程。我对 Lisp 不是 100% 熟悉,但我认为它与 OCaml 有一些相同的问题,因为没有一流的库支持。你如何在 Lisp 中进行数据库访问?高性能图形呢?

    如果您想了解有关“为什么选择 .NET”的更多信息,请查看此SO question

    【讨论】:

    • “将 Lisp 直接与 F# 进行比较并不公平,因为在一天结束的时候,你可以用任何一种语言编写相同的应用程序。”图灵完备性没有戈德温定律吗?
    【解决方案3】:

    如果您了解 F# 和 Lisp,您会发现这是一个相当奇怪的问题。

    正如其他人所指出的,Lisp 是动态类型的。更重要的是,Lisp 的独特之处在于它具有谐音性:Lisp 代码是一种基本的 Lisp 数据类型(列表)。宏系统利用这一点,让您编写在编译时执行并修改其他代码的代码

    F# 没有这样的东西 - 它是一种静态类型的语言,它借鉴了 ML 和 Haskell 的许多想法,并在 .NET 上运行它

    您的问题类似于“如果我知道如何使用叉子,为什么还要学习使用勺子?”

    【讨论】:

    • 这是不正确的。 F# 既有引用又有完整的元编程。例如,F# 代码 .Eval() 等价于 Lisp 代码 (eval '(+ 1 2))。
    • 当然,但是表示 .Eval() 的 AST 的数据的符号是什么?在 Lisp 中,'(eval '(+ 1 2)) 是计算字符串解析为 AST 的表达式。 AST 是一个包含两个元素的列表——一个函数eval' and a list with three elements - a function +' 和两个参数1' and 2'。这就是 Lisp 同音异义的意思。
    • 换句话说,我不知道你在说什么。我没有提到元编程(根据你的定义,JavaScript 有)。我也没有提到“引用”,不管你是什么意思。
    • F# 中的引用和元编程提供与 Lisp 中的 QUOTE 和 EVAL 完全相同的功能。您关于“F# 没有这样的东西”的说法是不正确的。您编写的 Lisp 代码 '(+ 1 2) 是引用的示例。因此,您在编写时使用了引号。这在 F# 中可以等效地写为 .
    • 我想添加 F# 类型提供程序,以添加其他编译时功能。
    【解决方案4】:

    鉴于 LISP 是动态类型,而 F# 是静态类型,我觉得这样的比较很奇怪。

    【讨论】:

    • 您可能想学习 F# 的一个原因是了解静态类型的函数式语言是什么样的。
    【解决方案5】:

    如果我从 Lisp 切换到 F#,那完全是因为我手头有一项任务,该任务极大地受益于一些仅限 .NET 的库。

    但我没有,所以我不是。

    【讨论】:

      【解决方案6】:

      钱。 F# 代码已经比 Lisp 代码更有价值,随着 F# 的广泛采用,这种差距将迅速扩大。

      换句话说,与使用 Lisp 相比,使用 F# 获得稳定收入的机会要大得多。

      干杯, 乔恩·哈罗普。

      【讨论】:

      • +1:我的吝啬鬼对这个答案很满意,但它也很实用。只要我们不走“好吧,什么语言让我们最赚钱?我知道,我们将使用 Java!”的道路。 ;)
      【解决方案7】:

      与大多数 Lisp 方言相比,F# 是一种非常不同的语言。所以 F# 为您提供了一个非常不同的编程角度——一个您不会从 Lisp 中学到的角度。大多数 Lisp 方言最适合用于符号软件的增量、交互式开发。同时,大多数 Lisp 方言不是函数式编程语言,而更像是多范式语言——不同的方言对支持 FPL 功能的重视程度不同(无副作用、不可变数据结构、代数数据类型……)。因此,大多数 Lisp 方言要么缺乏静态类型,要么不太重视它。

      所以,如果你知道一些 Lisp 方言,那么学习 F# 会很有意义。只是不要认为你的 Lisp 知识大部分适用于 F#,因为 F# 是一种非常不同的语言。就像使用 C 或 Java 的命令式编程在学习 Lisp 时需要忘掉一些想法一样,在使用 F# 时也需要忘掉 Lisp 习惯(没有类型、副作用、宏......)。 F# 也由 Microsoft 驱动并利用 .net 框架。

      【讨论】:

        【解决方案8】:

        F# 的好处是 .NET 开发(一般而言)被广泛采用、易于获得且更大众化。

        如果您想编写 F# 代码,您可以使用 Visual Studio,许多开发人员已经拥有...而不是让 LISP 环境启动并运行。

        此外,现有的 .NET 开发人员更倾向于关注 F#,而不是 LISP,如果这对您意味着什么的话。

        (来自一位在大学期间编写并喜爱 LISP 的 .NET 开发人员)。

        【讨论】:

          【解决方案9】:

          我不确定你是否愿意?如果您觉得 F# 有趣,那将是一个原因。如果您的工作需要它,那将是一个原因。如果您认为它会提高您的工作效率或为您带来现有知识的附加值,那将是一个原因。

          但如果你不觉得 F# 有趣,你的工作不需要它,而且你认为它不会让你更有效率或给你带来附加值,那你为什么会呢?

          另一方面,如果问题是 F# 提供了 lisp 不提供的功能,则应考虑类型推断、模式匹配以及与 .NET 框架的其余部分的集成。

          【讨论】:

            【解决方案10】:

            我知道这个帖子很旧,但自从我偶然发现这个帖子后,我只想评论一下我的原因。我学习 F# 只是为了获得专业机会,因为 .NET 在主导我所在领域的一类公司中占有重要地位。功能范式在更多以定量和数据为导向的公司中的使用越来越多,我想成为这一趋势的先行者之一。目前不存在与 .NET 库完全安全集成的强大功能语言。我实际上试图从 Lisp 代码中移植一些 .NET,这真的很痛苦,因为 FFI 只支持 C 原语,而 .NET 互操作性需要一个“接口”构造,即使我知道如何在 C 中做到这一点,这确实是一个巨大的疼痛。如果 Lisp 在它的下一个标准中加倍努力并需要一个 c++ 类(包括带有 vtables 的虚函数)和它的 FFI 中的 C# 样式接口类型,那将是非常非常好的。甚至还可以引入 Java 接口样式类型。这将实现与 .NET 库的完全互操作性,并使 Lisp 成为大规模语言的有力竞争者。然而话虽如此,来自 Lisp 背景使得学习 F# 变得相当容易。而且我喜欢 F# 如何付出更多努力来提供您通常会看到的定量类型工作的类型。我相信 F# 的创建考虑了数学工作,并且它本身比 Lisp 更有价值。

            【讨论】:

              【解决方案11】:

              看待这个(原始问题)的一种方法是将语言(以及相关的工具和平台)与当前任务相匹配。如果该任务需要绝大多数 .NET 代码,并且在一种语言中比另一种语言需要更少的鞋拔来完成任务,那么选择阻力最小的路径 (F#)。如果您不需要 .NET 功能,并且您对使用 LISP 感到很自在,并且无需弯腰摆脱它,请继续使用它。

              与比较锤子和扳手并没有太大区别。选择最适合工作的工具。试图选择一个客观上“最好”的工具是无稽之谈。而且无论如何,在 20 年后,所有当前“热门”的语言都可能已经过时了。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2015-01-07
                • 2010-11-05
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-10-04
                • 1970-01-01
                相关资源
                最近更新 更多