Existentially quantified types说明:Haskell和Scala中的通用量化类型?
任何使用小写类型的隐式地与
forall
关键字开始,所以这两个类型声明在地图是等价的,因为低于声明:
id :: a -> a
id :: forall a . a -> a
鉴于斯卡拉的scala.Predef#identity,是否有一个相当于forall
,即按照Haskell的上述第二个函数?
Existentially quantified types说明:Haskell和Scala中的通用量化类型?
任何使用小写类型的隐式地与
forall
关键字开始,所以这两个类型声明在地图是等价的,因为低于声明:
id :: a -> a
id :: forall a . a -> a
鉴于斯卡拉的scala.Predef#identity,是否有一个相当于forall
,即按照Haskell的上述第二个函数?
有Scala中没有明确forall
,但它等同于不同的方式明确forall
s的哈斯克尔使用:
要启用ScopedTypeVariables
:没有必要,因为Scala的类型变量的作用域默认。
对于存在类型:Scala直接支持它们。
对于较高等级类型,即那些具有嵌套在功能箭头一个forall
:考虑这个例子:
f2 :: (forall a. a->a) -> Int -> Int
f2 f x = f x
在Scala中[A](A => A)
不能直接使用,但
相当于它,所以你可以执行f2
:
def f2(p: Poly1, x: Int) = p(x)
我不是斯卡拉专家,但我的理解是,所有的Scala类型参数被普遍量化(即用forall
声明)除非他们明确地与forSome
量化。见,例如:
What is the forSome keyword in Scala for?
在Haskell我们使用forall
关键字来声明存在的类型。这似乎是违反直觉的使用forall
当我们指for some
,但它可以使用下面的语句逻辑等价来完成:
(forSome x. P(x)) implies Q
(forall x. P(x) implies Q)
这里Q是不包含X的声明。
我不太了解斯卡拉,但不是它和引文中的一样吗?我假设'def'中的'A' [A](x:A):A'也是'Forall A' – Carsten