用于静态强类型语言(如Haskell)和动态(强)语言(如Common LIsp)

时间:2009-01-28 03:17:29

标签: emacs dynamic haskell static lisp

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

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

热门Lisp应用程序: emacs的

流行的Haskell应用程序: PUGS 的darcs

你同意吗,对此有任何研究吗?

5 个答案:

答案 0 :(得分:14)

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

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

Common Lisp的优势(众多)在于它的动态性和同质性(也就是说,Lisp程序很容易表示和操作Lisp数据) - Lisp是一种“可编程编程语言”。例如,如果您的程序最容易用新的特定于域的语言表达,那么Lisp使得它非常容易实现。 Lisp(以及其他动态语言)非常适合您的问题描述处理类型指定不当或可能随着开发进度而变化的数据。

语言选择通常与任何事物一样是美学决定。如果您的项目要求不会因兼容性,依赖性或性能原因而限制您使用特定语言,那么您也可以选择您认为最合适的语言。

答案 1 :(得分:5)

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

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

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

有许多关于比较无类型,弱类型和强类型语言的研究。这些研究总是要么说其中一个更好,要么说没有可观察到的差异。然而,研究之间几乎没有一致意见。

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

答案 2 :(得分:4)

我主要来自Common Lisp的观点,据我所知,Common Lisp适用于任何应用程序。

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

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

我不知道CL对于TCP / IP服务器或代码解析器来说不应该像Haskell一样有用 - 而是相反,但到目前为止,我与Haskell的联系一直很简短。

答案 3 :(得分:3)

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

据称,这降低了犯某些类型错误的可能性。而且,用Haskell编写的程序比用典型编程语言编写的程序更简洁,更简洁。 Haskell也大量使用非严格的,懒惰的评估,这在理论上可以让编译器进行其他方式无法实现的优化(以及无副作用范例)。

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

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

答案 4 :(得分:0)

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

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

不使用鸭子打字会导致类似这样的事情:

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

另一方面,Haskell的好处是安全的。例如,您可以使用类型确保Fahrenheit and Celsius are never mixed unintentionally中的度数。除此之外,我发现静态类型语言有更好的IDE。