2016-05-31 29 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的聲明。