【问题标题】:Universally Quantified Types in Haskell and Scala?Haskell 和 Scala 中的通用量化类型?
【发布时间】:2016-05-31 03:16:37
【问题描述】:

Existentially quantified types 解释:

任何小写类型的使用都隐含地以 forall 关键字开头,因此 map 的两个类型声明是等价的,如下声明:

id :: a -> a
id :: forall a . a -> a

鉴于 Scala 的 scala.Predef#identity,是否有 forall 等效项,即按照 Haskell 的上述第二个函数?

【问题讨论】:

  • 我对 scala 了解不多,但它不是和引文中的一样吗?我会假设def identity[A](x: A): A 中的A 也是forall A

标签: scala haskell


【解决方案1】:

Scala 中没有显式 forall,但它与 Haskell 中使用显式 foralls 的不同方式等效:

  1. 启用ScopedTypeVariables:没有必要,因为Scala类型变量是默认作用域的。

  2. 对于存在类型:Scala 直接支持它们。

  3. 对于更高级别的类型,即在函数箭头下嵌套有 forall 的类型:考虑这个例子:

    f2 :: (forall a. a->a) -> Int -> Int
    f2 f x = f x
    

    在Scala中[A](A => A)不能直接使用,但是

    trait Poly1 {
      def apply[A](x: A): A
    }
    

    等价于它,所以可以实现f2:

    def f2(p: Poly1, x: Int) = p(x)
    

【讨论】:

  • 我不太明白您的第三点,可能是因为我不熟悉 Haskell 示例:Poly1 方法相对于标准 Int => Int 到底有什么好处?
  • @Adowrath 对于这种情况,没有区别。请考虑使用def f3(p: Poly1, x: Int, y: Bool) = (f3(x), f3(y))(与Haskell 不同,Scala 也可以在此处使用Any => Any,但它会给出不同且不太精确的返回类型)。
  • 有趣。我认为这对于存在类型也是可能的,但似乎我的理解还不够。谢谢!
【解决方案2】:

我不是 Scala 专家,但我的理解是所有 Scala 类型参数都是通用量化的(即用 forall 声明)除非它们是用 forSome 明确量化的。例如,请参阅:

What is the forSome keyword in Scala for?

在 Haskell 中,我们使用 forall 关键字来声明存在类型。当我们指的是for some 时,使用forall 可能看起来违反直觉,但可以使用以下语句的逻辑等价来完成:

(forSome x. P(x))  implies  Q   

(forall x. P(x)    implies  Q)

这里的Q是一个不包含x的语句。

【讨论】:

    猜你喜欢
    • 2015-03-08
    • 1970-01-01
    • 2019-07-20
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多