【发布时间】:2023-03-14 21:04:02
【问题描述】:
目前我正在学习 Scala 和 Haskell。
我想知道 Haskell 在某些方面是否比 Scala (+ ScalaZ) 更强大? 例如,我知道 Haskell 的代数数据类型、TypeClasses、currying、惰性等可以在 Scala 中很好地实现。
是否有一些 Haskell 程序无法轻松映射到 Scala?如果是,那么 Scala 中缺少什么功能会阻止这种映射?
我的直觉是 Scala 至少和 Haskell 一样强大,我只是不确定这种直觉是否正确。有人可以证实这一点吗?
编辑: 我明白亚伯拉罕森的观点。仿真的定义确实至关重要。我会从实际的角度来定义仿真,假设一个知道 Haskell 和 Scala 的程序员可以在 1-2 小时内将 100 行 Haskell 代码转换为等效的 Scala 代码。现在的问题是,什么是等价的?这意味着,将 Haskell 代码中的逻辑构造转换为 Scala 中的等效逻辑构造,例如 Haskell 中的类型类转换为使用隐式实现的等效构造。
编辑 2: 回应 Travis 的评论:为简单起见,我们只考虑 vanilla Haskell。
编辑 3:
This 问题类似。
【问题讨论】:
-
除了优化编译器和默认情况下所有东西都是惰性的而不需要显式声明它吗?
-
并在您最需要的时候输入不会让您失望的推理?
-
由于通常情况,这有点定义不清:您可以在 Scala 中编写一个 Haskell 解释器并获得您喜欢的任何功能。除非“仿真”得到更严格的定义,否则我怀疑这个问题会有一个有意义的答案。
-
您也可以澄清一下您是指 Haskell 本身还是 Haskell 以及所有 GHC 扩展——例如kind 多态性是 Scala 所没有的一个非常简洁的东西。
-
Scala 是不纯的,你无法解决这个问题。除了其他好处之外,由于纯粹性,Haskell 的类型系统能够在 Scala 甚至没有达到的领域提供安全和保证。例如,使用 monad,您可以为上下文提供有意限制的一组操作,从而保护它免受不良副作用的影响(查看 STM)。另一方面,在 Scala 中,您可以从程序的任何位置发射火箭,而无需对类型有任何概念。此类东西引入的错误很难跟踪,因为它们需要将整个程序恢复到特定状态。