【发布时间】:2010-09-12 17:03:57
【问题描述】:
当您已经熟悉 LISP 时,学习 F# 的附加价值是什么?
【问题讨论】:
标签: f# functional-programming lisp
当您已经熟悉 LISP 时,学习 F# 的附加价值是什么?
【问题讨论】:
标签: f# functional-programming lisp
其中很多是编程语言世界中相对较新的发展。这是您将在 F# 中看到的,而在 Lisp,尤其是 Common Lisp 中不会看到的东西,因为 F# 标准仍在开发中。结果,你会发现有很多东西要学。当然,像 ADT、模式匹配、monad 和 currying 之类的东西可以在 Lisp 中构建为一个库,但学习如何在方便内置的语言中使用它们会更好。
学习 F# 以供实际使用的最大优势在于它与 .NET 的集成。
【讨论】:
type Expr = Num of float | Var of string | Add of Expr * Expr | Mul of Expr * Expr,其具有模式匹配的函数,例如区分Expr 类型的值。我不知道 CL 中的等价物,除非您使用 Qi 之类的东西,在这种情况下,您是 Greenspunning F#。
将 Lisp 直接与 F# 进行比较并不公平,因为归根结底,如果有足够的时间,您可以用任何一种语言编写相同的应用程序。
但是,您应该学习 F#,原因与 C# 或 Java 开发人员应该学习 F# 的原因相同 - 因为它允许在 .NET 平台上进行函数式编程。我对 Lisp 不是 100% 熟悉,但我认为它与 OCaml 有一些相同的问题,因为没有一流的库支持。你如何在 Lisp 中进行数据库访问?高性能图形呢?
如果您想了解有关“为什么选择 .NET”的更多信息,请查看此SO question。
【讨论】:
如果您了解 F# 和 Lisp,您会发现这是一个相当奇怪的问题。
正如其他人所指出的,Lisp 是动态类型的。更重要的是,Lisp 的独特之处在于它具有谐音性:Lisp 代码是一种基本的 Lisp 数据类型(列表)。宏系统利用这一点,让您编写在编译时执行并修改其他代码的代码。
F# 没有这样的东西 - 它是一种静态类型的语言,它借鉴了 ML 和 Haskell 的许多想法,并在 .NET 上运行它
您的问题类似于“如果我知道如何使用叉子,为什么还要学习使用勺子?”
【讨论】:
eval' and a list with three elements - a function +' 和两个参数1' and 2'。这就是 Lisp 同音异义的意思。
鉴于 LISP 是动态类型,而 F# 是静态类型,我觉得这样的比较很奇怪。
【讨论】:
如果我从 Lisp 切换到 F#,那完全是因为我手头有一项任务,该任务极大地受益于一些仅限 .NET 的库。
但我没有,所以我不是。
【讨论】:
钱。 F# 代码已经比 Lisp 代码更有价值,随着 F# 的广泛采用,这种差距将迅速扩大。
换句话说,与使用 Lisp 相比,使用 F# 获得稳定收入的机会要大得多。
干杯, 乔恩·哈罗普。
【讨论】:
与大多数 Lisp 方言相比,F# 是一种非常不同的语言。所以 F# 为您提供了一个非常不同的编程角度——一个您不会从 Lisp 中学到的角度。大多数 Lisp 方言最适合用于符号软件的增量、交互式开发。同时,大多数 Lisp 方言不是函数式编程语言,而更像是多范式语言——不同的方言对支持 FPL 功能的重视程度不同(无副作用、不可变数据结构、代数数据类型……)。因此,大多数 Lisp 方言要么缺乏静态类型,要么不太重视它。
所以,如果你知道一些 Lisp 方言,那么学习 F# 会很有意义。只是不要认为你的 Lisp 知识大部分适用于 F#,因为 F# 是一种非常不同的语言。就像使用 C 或 Java 的命令式编程在学习 Lisp 时需要忘掉一些想法一样,在使用 F# 时也需要忘掉 Lisp 习惯(没有类型、副作用、宏......)。 F# 也由 Microsoft 驱动并利用 .net 框架。
【讨论】:
F# 的好处是 .NET 开发(一般而言)被广泛采用、易于获得且更大众化。
如果您想编写 F# 代码,您可以使用 Visual Studio,许多开发人员已经拥有...而不是让 LISP 环境启动并运行。
此外,现有的 .NET 开发人员更倾向于关注 F#,而不是 LISP,如果这对您意味着什么的话。
(来自一位在大学期间编写并喜爱 LISP 的 .NET 开发人员)。
【讨论】:
我不确定你是否愿意?如果您觉得 F# 有趣,那将是一个原因。如果您的工作需要它,那将是一个原因。如果您认为它会提高您的工作效率或为您带来现有知识的附加值,那将是一个原因。
但如果你不觉得 F# 有趣,你的工作不需要它,而且你认为它不会让你更有效率或给你带来附加值,那你为什么会呢?
另一方面,如果问题是 F# 提供了 lisp 不提供的功能,则应考虑类型推断、模式匹配以及与 .NET 框架的其余部分的集成。
【讨论】:
我知道这个帖子很旧,但自从我偶然发现这个帖子后,我只想评论一下我的原因。我学习 F# 只是为了获得专业机会,因为 .NET 在主导我所在领域的一类公司中占有重要地位。功能范式在更多以定量和数据为导向的公司中的使用越来越多,我想成为这一趋势的先行者之一。目前不存在与 .NET 库完全安全集成的强大功能语言。我实际上试图从 Lisp 代码中移植一些 .NET,这真的很痛苦,因为 FFI 只支持 C 原语,而 .NET 互操作性需要一个“接口”构造,即使我知道如何在 C 中做到这一点,这确实是一个巨大的疼痛。如果 Lisp 在它的下一个标准中加倍努力并需要一个 c++ 类(包括带有 vtables 的虚函数)和它的 FFI 中的 C# 样式接口类型,那将是非常非常好的。甚至还可以引入 Java 接口样式类型。这将实现与 .NET 库的完全互操作性,并使 Lisp 成为大规模语言的有力竞争者。然而话虽如此,来自 Lisp 背景使得学习 F# 变得相当容易。而且我喜欢 F# 如何付出更多努力来提供您通常会看到的定量类型工作的类型。我相信 F# 的创建考虑了数学工作,并且它本身比 Lisp 更有价值。
【讨论】:
看待这个(原始问题)的一种方法是将语言(以及相关的工具和平台)与当前任务相匹配。如果该任务需要绝大多数 .NET 代码,并且在一种语言中比另一种语言需要更少的鞋拔来完成任务,那么选择阻力最小的路径 (F#)。如果您不需要 .NET 功能,并且您对使用 LISP 感到很自在,并且无需弯腰摆脱它,请继续使用它。
与比较锤子和扳手并没有太大区别。选择最适合工作的工具。试图选择一个客观上“最好”的工具是无稽之谈。而且无论如何,在 20 年后,所有当前“热门”的语言都可能已经过时了。
【讨论】: