Existentially quantified types解释说:
任何小写类型的使用都隐含地以
forall
关键字开头,因此map的两个类型声明是等效的,如下面的声明:
id :: a -> a
id :: forall a . a -> a
鉴于Scala的scala.Predef#identity,是否有forall
等价物,即每个Haskell的第二个函数?
答案 0 :(得分:7)
Scala中没有显式 forall
,但它与Haskell中使用显式forall
的不同方式相同:
启用ScopedTypeVariables
:不必要,因为Scala类型变量默认为作用域。
对于存在类型:Scala直接支持它们。
对于更高级别的类型,即在函数箭头下嵌套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 的声明。