像Haskell这样的静态强类型语言和Common Lisp这样的动态(强)类型语言的用途

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

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

Lisp的流行应用: Emacs

Haskell的流行应用: PUGS Darcs

您是否同意,并且有没有相关研究?

5个回答

14

编程语言是用于思考的工具。如果你足够努力,可以用任何语言来表达任何程序。一个编程语言相对于另一个提供的最主要价值在于它为从不同角度思考问题提供的支持程度。

例如,Haskell 是一种强调从类型角度思考问题的语言。如果有一种便捷的方式可以用 Haskell 的数据类型来表达问题,那么你很可能会发现这是一种编写程序方便的语言。

Common Lisp 的优点(很多)在于其动态性质和同构性(也就是说,Lisp 程序非常容易表示和操作为 Lisp 数据)——Lisp 是一种“可编程的编程语言”。例如,如果您的程序最容易用新领域特定语言表达,Lisp 使得这个过程非常容易。如果你的问题描述涉及到数据类型难以指定或在开发过程中可能会变化,那么 Lisp(以及其他动态语言)是一个很好的选择。

语言选择通常是审美决策之一。如果您的项目需求没有限制您使用特定的语言进行兼容性、依赖性或性能方面的原因,那么你可以选择实现感觉最好的语言。


5
您正在打开多个非常复杂的问题。首先,是强类型语言与弱类型语言之间的区别。其次,是函数式语言与命令式语言之间的区别。
(实际上,我很好奇:您所说的“Lisp方言”是否指的是Clojure?因为它在某些方面更接近Haskell,并且主要是函数式的。)
好的,那么首先,您可以使用任何一种正常的语言编写几乎任何程序,只是需要付出更多或更少的努力。强类型的声称优势在于可以在编译时检测到大量错误。另一方面,类型不够明确的语言可能更容易编写。Common Lisp很有趣,因为它是一种动态语言,可以声明和使用更强的类型,这给CL编译器提供了提示,以便进行优化。(哦,真正的Common Lisp通常是使用编译器实现的,这样您就可以选择编译或继续使用解释代码。)
有许多关于比较未经分类、弱类型和强类型语言的研究。这些研究总是说其中一种更好,或者说没有观察到差异。然而,这些研究之间很少达成共识。
最可能存在明显优势的领域是处理数学问题的复杂规范。在这些情况下(加密算法就是一个例子),像Haskell这样的函数式语言具有优势,因为更容易验证Haskell代码与底层算法之间的对应关系。

2
Common Lisp 也是强类型语言,只是它在运行时确定类型,即动态类型(与静态类型如 Haskell 相对)。不要混淆“静态”<->“动态”和“弱”<->“强”! - Svante
此外,Common Lisp 支持各种编程风格,包括函数式编程,因此这种争议也只是一个次要话题(Haskell 是“纯”的,而 CL 也适用于其他方式)。 - Svante
1
Harlequin,C如果你想要的话支持函数式风格。Haskell没有命令式赋值,Clojure只允许在受限制的特殊形式中使用。Common Lisp让你可以编写函数式代码,但不强制执行,Ruby和Python也是如此。 - Charlie Martin
不,C允许函数式编程风格,这与支持它完全不同。您可以直接在CL中使用函数式语言编写所有内容,就像在Scheme或Haskell中一样。"强制"并非"支持"的先决条件。当然,您可以在任何图灵完备的语言中做任何事情。 - Svante
你正在争论“is”的含义是什么。Common Lisp允许你以任何函数方式编写任何内容,但是一旦出现第一个放错位置的setf,程序就不再是真正的函数式程序了。Clojure至少强制将命令核心放在特殊块中,并强制执行事务性内存。 - Charlie Martin

4

我主要从Common Lisp的角度出发,就我所知,Common Lisp适用于任何应用。

是的,默认是动态类型(即在运行时检测类型),但你仍然可以为了优化而声明类型(顺便提一下,CL是强类型的;不要混淆弱/强类型和静态/动态类型!)。

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

我不明白为什么CL在TCP/IP服务器或代码解析器方面不如Haskell有用--相反,我认为它更有用,但我与Haskell的接触迄今为止很短暂。


4
Haskell不适合替代Ada。由于其惰性数据结构和垃圾回收机制,Haskell的性能常常是不可预测的,这在飞行软件中是不可取的。 - Rainer Joswig

3
Haskell是一种纯函数式语言。虽然它允许使用命令式结构(使用单子),但通常强制程序员以更数学导向的方式思考问题。例如,您不能将另一个值重新分配给变量。
据称,这降低了出现某些类型错误的概率。此外,用Haskell编写的程序往往比用典型编程语言编写的程序更短,更简洁。 Haskell还大量使用非严格的惰性评估,理论上可以使编译器进行不可能实现的优化(以及无副作用范例)。
由于您问到它,我认为Haskell的类型系统非常好用和有用。它不仅可以捕获常见错误,还可以使代码更加简洁 (!) 并有效地替代常见面向对象语言的对象导向结构。
一些Haskell开发工具包(如GHC)还具有交互式环境。

0

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

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

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

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

另一方面,Haskell的好处在于安全性。例如,您可以使用类型确保华氏度和摄氏度永远不会被意外混合。此外,我发现静态类型语言具有更好的集成开发环境。

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