【问题标题】:What feature in Haskell cannot be emulated with Scala? [closed]Haskell 中的哪些功能无法用 Scala 模拟? [关闭]
【发布时间】: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 中,您可以从程序的任何位置发射火箭,而无需对类型有任何概念。此类东西引入的错误很难跟踪,因为它们需要将整个程序恢复到特定状态。

标签: scala haskell


【解决方案1】:

虽然 Scala 有类型推断,但它比 Haskell 弱,因为 Haskell 使用(a 的扩展)Hindley-Milner type system,它允许特别强大的推断。 Scala 的类型系统允许更广泛的类型概念(例如它也是面向对象的),这意味着 Haskell 使用的类型推断算法不起作用。 (此外,实际上,为了让编译器和编译器编写者更容易,Scala 的类型推断比它可能的要弱。)

【讨论】:

  • 感谢您指出这一点!这是我的直觉不正确的一个特点,因此 Haskell 在某些方面更强大。记住这一点很好!
  • 最后一句话对所涉及的问题有点误解。 Scala 语言设计者确实知道如何使类型推断更强大,而编译器编写者确实知道如何实现它。他们知道如何提供好的错误消息。 Scala 社区非常重视良好的错误消息,如果该特定功能干扰了良好的错误消息,他们甚至可以放弃该语言的表达能力。例如,在 Haskell 中,您可能会遇到类型错误报告远离实际问题的情况,...
  • … 因为即使类型推断器在程序的某些部分出现了错误的转折,这实际上并不会导致矛盾,直到在更远的地方几乎不相关的部分程序。即使在 Haskell 中,在模块边界提供类型注释也是一种很好的做法,但在 Scala 中,每个方法都是一个模块!
猜你喜欢
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多