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