【问题标题】:Uses for both static strong typed languages like Haskell and dynamic (strong) languages like Common LIsp用于 Haskell 等静态强类型语言和 Common LIsp 等动态(强)语言
【发布时间】:2023-03-23 05:25:01
【问题描述】:

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

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

流行的 Lisp 应用程序: Emacs

流行的 Haskell 应用程序: 哈巴狗 达克斯

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

【问题讨论】:

    标签: emacs dynamic haskell static lisp


    【解决方案1】:

    我发现动态类型的最佳用途是当您依赖于您无法控制的事物时,它也可以动态使用。例如从 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。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          【解决方案4】:

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

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

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

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

          【讨论】:

          • Haskell 不能用作 Ada 的替代品。由于惰性数据结构和垃圾收集,Haskell 的性能通常无法预测。这在飞行软件中是不可取的。
          【解决方案5】:

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

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

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

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

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

          【讨论】:

          • Common Lisp 也是强类型的,它只是在运行时确定类型,即它是动态类型的(相对于静态类型,如 Haskell)。不要将“静态”“动态”与“弱”“强”混淆!
          • 此外,Common Lisp 支持多种编程风格,包括函数式编程,所以这个争议也是一个副话题(因为 Haskell 是“纯粹的”,而 CL 也适用于其他方式) .
          • Harlequin, C 支持函数式风格,如果你愿意的话。 Haskell 没有命令式赋值,Clojure 只允许它以一种受限制的特殊形式。 Common Lisp 让您可以进行函数式编写,但不会像 Ruby 和 Python 那样强制执行它。
          • 不,C 允许一种函数式风格,这与支持完全不同。您可以在 CL 中直接用函数式惯用语编写所有内容,就像在 Scheme 或 Haskell 中一样。 “力”不是“支持”的先决条件。当然,您可以用任何图灵完备的语言做任何事情。
          • 你在争论“是”是什么意思。 Common Lisp 让您可以用函数式编写任何东西,但该程序不再是真正的函数式程序,第一个错位 setf。 Clojure 至少会强制您将命令式核心放在特殊块中并强制执行事务内存。
          猜你喜欢
          • 2011-02-11
          • 2014-02-03
          • 2016-09-26
          • 2010-12-05
          • 2023-03-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多