如果您已经了解LISP,为什么还想学习F#?

7
学习F#对于已经熟悉LISP的人有什么附加价值?
11个回答

19

这些都是编程语言领域中相对较新的发展。这是您在F#中看到的,而在Lisp中,特别是Common Lisp中,您不会看到这些,因为F#标准仍在开发中。因此,您会发现有很多内容需要学习。当然,像ADT、模式匹配、单子和柯里化之类的东西在Lisp中可以作为库构建,但在方便的内置语言中学习它们更好。

学习F#以用于实际应用的最大优势是其与.NET的集成。


CL拥有代数数据类型、可扩展模式匹配和单子编程。它也具有柯里化(但语法不是那么好看)。因此,它缺少的是:
  • 静态类型
  • .NET支持
  • 将所有功能放在基础语言中而不是扩展中
  • “好看”的语法
- Faré
代数数据类型,可扩展模式匹配。考虑ADT type Expr = Num of float | Var of string | Add of Expr * Expr | Mul of Expr * Expr 和通过它进行模式匹配的功能,例如对类型Expr的值进行微分。除非你使用类似Qi的东西,否则我不知道CL中是否有一个等效的解决方案,而这种情况下你就是在用Greenspunning F#。 - J D
@Nathan:类型推断和类型提供程序是其他原因。 - J D

6
比较Lisp和F#并不公平,因为在足够的时间内,您可以使用任何一种语言编写相同的应用程序。
然而,您应该学习F#的原因与C#或Java开发人员学习它的原因相同——因为它允许在.NET平台上进行函数式编程。我不完全了解Lisp,但我认为它与OCaml存在一些相同的问题,即没有出色的库支持。如何在Lisp中进行数据库访问?高性能图形呢?
如果您想了解更多关于“为什么选择.NET”的信息,请查看这个SO问题

1
将Lisp直接与F#进行比较并不公平,因为最终你可以用任何一种语言编写相同的应用程序,只要有足够的时间。难道图灵完备性没有类似于Godwin定律的东西吗? - Muhammad Alkarouri

6
如果你懂得F#和Lisp,那么你会发现这是一个相当奇怪的问题。
正如其他人所指出的那样,Lisp是动态类型语言。更重要的是,Lisp的独特之处在于它是同构的:Lisp代码是Lisp数据类型(列表)的一种基本形式。宏系统利用了这一点,让您编写可以在编译时执行并修改其他代码的代码。
F#没有像这样的功能-它是一种静态类型的语言,借鉴了ML和Haskell的许多思想,并在.NET上运行。
你所问的问题类似于“如果我知道如何使用叉子,为什么还需要学习使用勺子?”

2
这是不正确的。F#既有引号,也有完整的元编程。例如,F#代码<@ 1 + 2 @> .Eval()等同于Lisp代码(eval '(+ 1 2))。 - J D
4
好的,但代表<@1 + 2 @>.Eval()抽象语法树的数据符号是什么?在Lisp中,'(eval '(+ 1 2))是这个表达式,它评估为该字符串解析成的AST。AST是一个包含两个元素的列表 - 一个函数eval'和一个具有三个元素的列表 - 一个函数+'和两个参数1'和2'。这就是Lisp是同像的含义。 - Andrey Fedorov
3
换句话说,我不知道你在说什么。我没有提到元编程(根据你的定义,JavaScript 具备这一特性)。我也没有提到“引号”,无论你指的是什么意思。 - Andrey Fedorov
4
F# 中的引用和元编程与 Lisp 中的 QUOTE 和 EVAL 功能完全相同。你之前说 "F# 没有这种功能" 是不正确的。你写的 Lisp 代码 '(+ 1 2) 是一个引用的例子,因此你在写它时使用了引号。在 F# 中可以等价地写成 <@ 1+2 @>。 - J D
我想添加F#类型提供程序,以添加其他编译时功能。 - gsscoder

5

考虑到LISP是动态类型语言,而F#是静态类型语言,我认为这种比较有些奇怪。


学习 F# 的一个原因是了解静态类型的函数式语言是什么样子的。 - Nathan Shively-Sanders

3

如果我从Lisp转向F#,那只是因为我手头有一个极大受益于某些仅限于.NET的库的任务。

但我没有这样的任务,所以我不会这样做。


3

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

换句话说,使用F#比使用Lisp赚取稳定收入的机会要更大。

祝好, Jon Harrop。


2
+1:我内心的守财奴对这个答案感到满意,但这也非常实际。只要我们不走“哪种语言可以赚最多钱?我知道了,我们用Java!”之类的路线就好了;) - Juliet

3

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

所以,如果你知道一些Lisp方言,那么学习F#就有很多意义。只是不要认为你在Lisp中的许多知识也适用于F#,因为F#是一种非常不同的语言。正如一个使用C或Java的命令式编程者在学习Lisp时需要放弃一些思想一样,当使用F#时,人们也需要放弃Lisp习惯(没有类型、副作用、宏等)。F#也由微软推动并利用.net框架。


2

F#的好处是.NET开发(总体上)被广泛采用,易于获取,更具大众市场性。

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

此外,现有的.NET开发人员更有可能查看F#而不是LISP,如果这对您有意义的话。

(这来自一位.NET开发人员,他在大学时曾编写并喜欢LISP。)


1

我不确定你是否会有兴趣?如果你觉得F#很有趣,那就是一个理由。如果你的工作需要它,那也是一个理由。如果你认为使用它可以提高你的生产力或者给你带来比现在更多的价值,那也是一个理由。

但是如果你觉得F#没意思,你的工作也不需要它,而且你认为使用它不能提高你的生产力或者给你带来比现在更多的价值,那你为什么要用呢?

如果问题改成了F#相对于Lisp的优势在哪里,那应该考虑到类型推断、模式匹配以及与.NET框架的整合。


0

从一个角度来看,(原始问题)的一种方法是将语言(以及相关工具和平台)与即时任务相匹配。如果任务需要压倒性比例的.NET代码,并且使用一种语言比另一种语言更容易满足任务的要求,那么选择阻力最小的路径(F#)。如果您不需要.NET功能,并且习惯于使用LISP,并且没有强制性的理由离开它,请继续使用它。

这并不比将锤子与扳手进行比较有很大的不同。选择最有效地完成工作的工具。试图选择客观上“最佳”的工具是无意义的。而且,在任何情况下,20年后,所有目前“热门”的语言可能都已过时。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接