9

我正在使用 Lisp 方言,但也学习了一些 Haskell。它们有一些相似之处,但在 Common Lisp 中的主要区别似乎是您不必为每个函数、参数等定义类型,而在 Haskell 中则需要。此外,Haskell 主要是一种编译语言。运行编译器以生成可执行文件。

我的问题是,在不同的应用程序或用途中,像 Haskell 这样的语言可能比像 Common Lisp 这样更动态的语言更有意义。例如,似乎 Lisp 可以用于更多的底层编程,例如构建网站或 GUI,其中 Haskell 可以用于更需要编译时间检查的地方,例如构建 TCP/IP 服务器或代码解析器。

流行的 Lisp 应用程序:Emacs

流行的 Haskell 应用程序:PUGS Darcs

你同意吗,有没有这方面的研究?

4

5 回答 5

14

编程语言是用来思考的工具。如果你愿意努力工作,你可以用任何语言表达任何程序。一种编程语言相对于另一种编程语言的主要价值在于它为您以不同方式思考问题提供了多少支持。

例如,Haskell 是一种强调根据类型来思考问题的语言。如果有一种方便的方法可以用 Haskell 的数据类型来表达您的问题,您可能会发现它是一种方便的语言来编写您的程序。

Common Lisp 的优势(众多)在于其动态特性和同音性(即 Lisp 程序很容易作为 Lisp 数据表示和操作)—— Lisp 是一种“可编程编程语言”。例如,如果您的程序最容易用一种新的特定领域语言表达,那么 Lisp 可以很容易地做到这一点。如果您的问题描述处理的数据类型指定不明确或可能随着开发的进行而改变,那么 Lisp(和其他动态语言)非常适合。

语言选择通常与任何事物一样是一种审美决定。如果您的项目要求不会出于兼容性、依赖性或性能原因将您限制为特定语言,那么您不妨选择您感觉最好的语言。

于 2009-01-28T04:54:46.890 回答
5

您正在打开多罐非常蠕动的蠕虫。首先,整个强类型语言和弱类型语言都可以。其次,函数式语言与命令式语言可以。

(实际上,我很好奇:“lisp 方言”是指 Clojure 吗?因为它在很大程度上是功能性的,并且在某些方面更接近 Haskell。)

可以,然后呢。首先,您几乎可以用几乎任何普通语言编写几乎任何程序,只需付出或多或少的努力。强类型的据称优点是可以在编译时检测到一大类错误。另一方面,类型较少的语言更容易编写代码。Common Lisp 很有趣,因为它是一种动态语言,可以声明和使用更强的类型,这为 CL 编译器提供了如何优化的提示。(哦,真正的 Common Lisp 通常是用编译器实现的,让您可以选择编译或坚持使用解释代码。)

有许多关于比较无类型、弱类型和强类型语言的研究。这些研究总是要么说其中一个更好,要么说没有明显的差异。然而,研究之间几乎没有达成一致

可能有一些明显优势的最大领域是处理数学问题的复杂规范。在这些情况下(加密算法就是一个例子),像 Haskell 这样的函数式语言具有优势,因为它更容易验证 Haskell 代码和底层算法之间的对应关系。

于 2009-01-28T03:31:19.257 回答
4

我主要是从 Common Lisp 的角度来的,据我所知,Common Lisp 适用于任何应用程序。

是的,默认是动态类型(即在运行时进行类型检测),但您可以声明类型以进行优化(作为其他读者的旁注:CL 是强类型;不要将弱/强与静态/动态混淆!) .

我可以想象 Haskell 可能更适合在航空电子领域替代 Ada,因为它至少在编译时强制进行所有类型检查。

对于 TCP/IP 服务器或代码解析器,我不认为 CL 不应该像 Haskell 那样有用——恰恰相反,但到目前为止,我与 Haskell 的联系还很短暂。

于 2009-01-28T04:33:08.727 回答
3

Haskell 是一种纯函数式语言。虽然它确实允许命令式构造(使用 monad),但它通常会迫使程序员以一种完全不同的方式思考问题,使用更面向数学的方法。例如,您不能将另一个值重新分配给变量。

据称,这降低了犯某些类型错误的可能性。此外,用 Haskell 编写的程序往往比用典型编程语言编写的程序更短、更简洁。Haskell 还大量使用非严格的惰性求值,理论上这可以允许编译器进行原本不可能的优化(以及无副作用范式)。

既然你问了,我相信 Haskell 的打字系统非常好用。它不仅可以捕获常见错误,而且还可以使代码更简洁(!),并且可以有效地替换常见 OO 语言中的面向对象结构。

一些 Haskell 开发工具包,如 GHC,也具有交互环境。

于 2009-01-28T09:55:27.873 回答
0

我发现动态类型的最佳用途是当您依赖于您无法控制的事物时,它也可以动态使用。例如从 XML 文档中获取信息,我们可以这样做:

var volume = parseXML("mydoc.xml").speaker.volume()

不使用鸭子类型会导致这样的事情:

var volume = parseXML("mydoc.xml").getAttrib["speaker"].getAttrib["volume"].ToString()

另一方面,Haskell 的好处是安全。例如,您可以使用类型确保华氏度和摄氏度数不会无意混合。除此之外,我发现静态类型语言有更好的 IDE。

于 2009-04-06T16:04:19.937 回答