Haskell和Scala中的通用量化类型?

时间:2016-05-31 03:16:38

标签: scala haskell

Existentially quantified types解释说:

  

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

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

鉴于Scala的scala.Predef#identity,是否有forall等价物,即每个Haskell的第二个函数?

2 个答案:

答案 0 :(得分:7)

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

  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)
    

答案 1 :(得分:3)

我不是Scala专家,但我的理解是所有Scala类型参数都是普遍量化的(即使用forall声明,除非使用{{1}显式量化它们}。例如,见:

What is the forSome keyword in Scala for?

在Haskell中,我们使用forSome关键字来声明存在类型。当我们指forall时使用forall似乎违反直觉,但可以使用以下语句的逻辑等效来完成:

for some

此处Q是不包含 x 的声明。