Lisp如何与F#相关,并且正在学习Lisp是一个有用的F#?

时间:2009-06-23 16:04:27

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

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

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

至于F#,我可以将它与C#混合而没有任何互操作问题,有一个很棒的GUI(WPF)和许多其他.NET好东西。但它当然不像Lisp那样成熟。

如果我是现实的,我知道如果我想将功能性语言走私到我的职业生涯中,它必须是F#。由于学习两种完整的语言似乎有点多,我希望Lisp是学习函数式编程的好方法,如果我以后开始使用F#,那将非常容易....

这是真的吗?或者两种语言完全没有可比性?

9 个答案:

答案 0 :(得分:15)

Lisp是一个庞大的语言和实现系列。例如,Scheme是一种Lisp方言,可能有超过一百种实现(其中大约十种略显受欢迎)。 Common Lisp是另一种方言,目前维护的实现大约有十种。 Scheme和Common Lisp都有实现试图实现的书面标准。

F#既是语言又是实现。来自Microsoft。它主要来自OCAML,属于ML语言家族。

Lisp是一种支持函数式编程的早期语言(60年代的Lisp 1.5)。很多早期的函数式编程实验都是在Lisp中完成的。在Lisp社区的70年代,函数式编程的根源发生了变化,结果是 Scheme 。然后特别是在上世纪80年代和90年代出现了新的函数式语言(ML,Miranda,FP,SML,Haskell,Clean,......),它们与通常的Lisp方言完全不同。仍然有一些遗产,但大多数是在不同的方向发展(静态类型,类型推断,模块系统,批处理语言,代数数据类型,惰性评估,纯度等)。 Scheme社区仍然与FP社区有很多联系。但这主要是它。

有一些基本的FP思想可以独立于特定的FP语言学习,但通常F#与大多数Lisp方言非常不同。 F#支持.net生态系统的另一个特性(特别是因为它是微软的创建)并没有得到Lisp方言的良好支持。

我也不会期望知道像Emacs Lisp这样有限的Lisp方言来学习F#。

答案 1 :(得分:10)

我认为通过Common Lisp和F#学习的内容只有很小的“重叠”。共同点是我认为粗略

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

除了一些非常核心的功能编程之外,我认为Common Lisp和F#彼此相距甚远,因为两种主流的“功能”(非Haskell)语言都可以。 Common Lisp是动态的; F#是静态类型的。句法形式完全不同。运行时完全不同。图书馆非常不同。对象系统完全不同。

无论你学习它们的顺序如何,我认为在学习之后,在另一个学习中仍然需要学习更多的东西(模数我上面描述的小重叠)。

答案 2 :(得分:5)

F#与ML系列语言最具可比性,例如SML和CAML。语法和功能与Lisp不同。

但我认为从计算机科学的角度来看,学习至少一种功能语言非常重要。能够这样思考是好的。

而且,我会说,在启动F#之前学习一种更纯粹的函数式语言将是一种获得良好的函数式编程习惯的方法,因为如果你不这样做,你的F#代码最终可能会更多OO而且功能更少,因为那是你来自的地方。

答案 3 :(得分:4)

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

  1. 使用更纯粹的功能语言 像Lisp或Haskell一样会强迫 你打破了程序 心态;或

  2. 使用实用的功能语言 像F#也提供更多 熟悉,但功能较差, 构造可以帮助您轻松进入。

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

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

答案 4 :(得分:3)

需要考虑的两件重要事情是:

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

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

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

答案 5 :(得分:2)

它们都是函数式语言,但从语法上来说它们是非常不同的。这意味着很多概念将是相似的,你(作为一个程序开发人员)将不得不做同样的思维弯曲使用,但它们是非常不同的语言。

F#是ML的衍生物(其所有衍生物被认为是不纯的函数式语言),而Lisp较早,被认为是“纯粹的”功能语言。

功能语言的纯度是一个引人入胜的主题,我建议你阅读Language Purity and Dirty and Clean Functions以更好地理解这个概念:

  

很多人谈论“纯粹”   功能语言,“纯粹”   似乎是“好”的代名词。   通常有两个特征   与a的定义相关联   纯函数式语言:

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

答案 6 :(得分:2)

我只是F#的新手,但我在F#之前研究过Lisp,并且相信它在.NET框架和编程语言的范围内对F#进行语境化非常有帮助。

我衷心建议至少观看前几个视频:

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

这些教你在第一个小时内掌握Lisp的基础知识。该系列以这些知识为基础,并灌输了那些令人兴奋的原则。

答案 7 :(得分:1)

F#和Scheme的语义与强类型的注意例外非常相似。

另外,Scheme太小了,不去学习它!

答案 8 :(得分:0)

作为一种编程语言,Lisp本身就非常特别,但除了它们都支持函数式编程外,它与F#完全不相似。从Lisp到F#的语言结构并不多。如果你想学习lisp去吧。函数式编程的想法将不仅仅是语法。 Lisp真的很老了,50年代后期。许多语言受到它的影响,并且有很多方言。

如果您只是在F#之前寻找一种纯粹的功能性语言,我会建议使用Haskell。 Haskell受ML的影响很大,并且是F#的一种很好的过渡语言,因为F#是ML的衍生物。您可以查看Haskell代码并查看F#代码中的类似模式。