2016-05-31 34 views
3

Existentially quantified types说明:Haskell和Scala中的通用量化类型?

任何使用小写类型的隐式地与forall关键字开始,所以这两个类型声明在地图是等价的,因为低于声明:

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

鉴于斯卡拉的scala.Predef#identity,是否有一个相当于forall,即按照Haskell的上述第二个函数?

+0

我不太了解斯卡拉,但不是它和引文中的一样吗?我假设'def'中的'A' [A](x:A):A'也是'Forall A' – Carsten

回答

6

有Scala中没有明确forall,但它等同于不同的方式明确forall s的哈斯克尔使用:

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

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

  3. 对于较高等级类型,即那些具有嵌套在功能箭头一个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) 
    
+0

我不太了解你的第三点,可能是因为我不熟悉什么Haskell的例子是:Poly1方法对标准的'Int => Int'的好处是什么? – Adowrath

+1

@Adowrath对于这种情况,没有区别。考虑'def f3(p:Poly1,x:Int,y:Bool)=(f3(x),f3(y))'(与Haskell不同,Scala在这里也可以使用'Any => Any'会给出一个不同的,不太精确的返回类型)。 –

+0

有趣。我认为这也可能与存在型有关,但似乎我的理解力不足。谢谢! – Adowrath

2

我不是斯卡拉专家,但我的理解是,所有的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的声明。