Lisp和F#有什么关系?学习Lisp对于学习F#有帮助吗?

14
这是情况:我主要编写C#,编写了一些类型,不想失去。与此同时,我想学习函数式编程。当然,显而易见的答案是F#。
但除了C#以外的所有内容都使用emacs作为编辑器,我真的很想学习Lisp。 (你知道,学习编辑器/IDE的语言,这就是我会一点VB来编写我的VS宏的原因)而且不仅仅是emacs,Lisp是我真正想学的东西。
至于F#,我可以将其与C#混合使用,没有任何Interop问题,具有出色的GUI(WPF)和许多其他.NET好处。 但是,它当然不如Lisp成熟。
如果我现实一点,我知道如果我想在我的专业生活中走偏函数式编程语言,那么它必须是F#。由于学习两种完全不同的语言似乎有些困难,我希望Lisp是学习函数式编程的好方法,如果以后再开始使用F#,那将非常容易...
这是真的吗? 还是两种语言根本无法比较?
9个回答

16

Lisp是一个大家族的语言和实现。 比如Scheme是一种Lisp方言,可能有100多个实现(其中大约10个比较流行)。Common Lisp是另一种方言,目前有大约10个维护的实现。Scheme和Common Lisp都有编写的标准,实现者尽量去实现这些标准。

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

Lisp是支持函数式编程的最早的语言之一(60年代的Lisp 1.5版本)。许多早期探索函数式编程的实验都是在Lisp中进行的。70年代,在Lisp社区中出现了一个回归函数式编程根源的运动,结果产生了Scheme。然后,在上世纪80年代和90年代出现了新的函数式语言(ML,Miranda,FP,SML,Haskell,Clean等),它们与通常的Lisp方言非常不同。虽然仍然有一些血统关系,但它们主要发展成了不同的方向(静态类型、类型推断、模块系统、批处理语言、代数数据类型、惰性求值、纯度等等)。Scheme社区仍然与FP社区有很多联系。但仅此而已。

有一些基本的函数式编程思想可以独立于特定的函数式语言学习,但一般来说,F#与大多数Lisp方言非常不同。另一个特点是,由于它是微软开发的,F#支持.NET生态系统的情况得到了很好的支持,但这并不适用于Lisp方言。

我也不会指望通过学习Emacs Lisp等受限制的Lisp方言来获得学习F#的很大益处。


1
@Thorbjørn Ravn Andersen:“Lisp”是一种非常早期的语言,基于McCarthy团队设计的内容。后来它不再是一种语言,因为它变成了一系列相关语言和方言的家族。不再有单一的“Lisp”语言。早期的Lisp现在已经成为历史,我们有了不同的语言,如Scheme、Common Lisp、Clojure、Logo等。 - Rainer Joswig

10

我认为在Common Lisp和F#之间,只有很少的“重叠”,即两者的共性大致如下:

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

除了这些非常核心的函数式编程知识,我认为Common Lisp和F#在主流的“函数式”(非Haskell)语言中彼此相距甚远。Common Lisp是动态的;F#是静态类型的。语法形式完全不同。运行时也完全不同,库也非常不同,对象系统也完全不同。

无论你选择哪种顺序学习它们,我认为在学习其中一种之后,仍然需要学习另一种(除了我上面描述的小重叠部分)。


5

F#最相似于ML语言家族,如SML和CAML。 它的语法和特性与Lisp不同。

但我认为从计算机科学的角度来看,学习至少一种函数式编程语言非常重要。 能够以这种方式思考是很好的。

而且,我会说,在开始学习F#之前学习一种更纯粹的函数式语言是获得良好的函数式编程习惯的一种方式,因为如果你不这样做,你的F#代码可能会变得更加面向对象而不是函数式,因为这是你原本的思维方向。


6
F#不仅仅能够与ML相媲美,它实际上是从ML派生而来的。 - Andrew Hare

5
在我看来,学习函数式编程有两种方法:
  1. 使用更纯净的函数式语言,例如Scheme(一种Lisp)或Haskell,这将迫使您立即摆脱过程性思维方式;或

  2. 使用实用的函数式语言,例如F#,它也提供了更熟悉但不太函数式的结构,以帮助您逐步了解。

无论哪种情况,如果您能用该语言做一些有用的事情,您将从学习经验中获得更多收益。听起来您对Lisp(Emacs)和F#(.NET互操作性)都有动力,因此我建议您同时查看两者并看看哪个能吸引您。
最终,理解函数式编程概念(高阶函数,无副作用,尾递归等)比任何一种语言更有价值。一旦您学会了这些概念,就会更容易学习新语言并将技术应用于其他语言(如越来越函数式的C#)。沿着这些线路,您可能会对Functional Programming for the Real World感兴趣。

你可能会感兴趣 --> 是的,谢谢。我认为我会选择突破情况并开始使用Lisp。 - Peter
这些链接的书非常有帮助。 - AlexWei
称Common Lisp为“函数式语言”是非常错误的。你可以在其中做任何想做的事情,甚至可以开枪打自己的脚,而Common Lisp编程的“惯用方式”并不是函数式的,而是“实用主义”的,即如果你想要改变就进行突变,如果你不想改变就不进行突变——这是一种情境选择和决策。那些只说“Lisp”的人不应该暗示任何Lisp都像Scheme一样工作,后者在其横幅上写着“函数式”。 - BitTickler

3

需要考虑的两个重要因素是:

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

尽管它们都被认为是函数式的,并且共享许多共同点,但它们也有所不同。学习 LISP 肯定会使你成为更好的 F# 程序员,反之亦然,但仍需学习它们各自的特点才能在实践中掌握它们。

为了能够与 .NET 进行交互,我肯定会选择 F#,但出于编程美感的考虑,我也会尝试使用 LISP。


2
它们都是功能语言,但在语法上非常不同。这意味着许多概念将是相似的,作为一个过程式开发者,你将不得不做出相同的努力来使用任何一种语言,但它们是非常不同的语言。
F# 是 ML 的一个派生语言(与其所有派生语言一起被认为是不纯的函数语言),而Lisp则更老,被认为是“纯”函数语言。
函数语言的纯度是一个迷人的话题,我建议你阅读Language Purity and Dirty and Clean Functions以更好地理解这个概念:
许多人谈论“纯”函数式语言,其中“纯”似乎是“好”的同义词。通常与纯函数式语言的定义相关联的有两个特征:1. 函数不能具有副作用;2. 使用任何给定参数调用的函数将始终返回相同的值。

8
现代 Lisp 实现并非纯函数式的,尽管你可以轻松地编写纯函数式的程序。 - David Thornley
5
Lisp 方言通常不是纯函数式编程语言。 - Rainer Joswig
同时,没有任何阻止你以纯风格编写 F#。 - VoronoiPotato

2

我对F#还不熟悉,但在学习F#之前,我学习了Lisp,并且认为这对于将F#置于.NET框架和各种编程语言中非常有帮助。

我强烈推荐至少观看这里的前几个视频:

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

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


1

F# 和 Scheme 的语义非常相似,唯一的例外是强类型。

此外,Scheme 如此简单,不学都难!


0

作为一种编程语言,Lisp在自己的领域里非常特别,但它与F#没有太多相似之处,除了它们都支持函数式编程。从Lisp到F#,很少有语言结构可以转移。如果你想学习Lisp,就去学吧。函数式编程的思想会延续下去,只是语法不同而已。Lisp非常古老,产生于50年代后期。许多语言受到了它的影响,也出现了很多方言。

如果你只是想在学习F#之前学习一种纯函数式语言,我建议学Haskell。Haskell受到ML的很大影响,是从ML派生出来的F#的一个很好的过渡语言。你可以看看Haskell代码,在F#代码中看到类似的模式。


Haskell与任何ML方言都非常不同。 - Rainer Joswig
2
从方言上来说,"Haskell的许多特性源于ML,两种语言具有相似的外观和感觉。" - 摘自http://www.haskell.org/haskell-history.html - gradbot
基本上,FP社区在默认使用哪种评估机制方面存在分歧。Haskell是非严格的,而ML系列则是严格的。这造成了巨大的差异。Haskell是标准的非严格语言。其次,Haskell是“纯”的(没有副作用),并且大量使用像单子这样的构造。ML方言通常是非纯的。这些语言家族核心的差异使它们在使用上非常不同。 - Rainer Joswig

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