2012-02-25 46 views

回答

15

不,不是所有的用法都可以這樣轉換。像這樣的東西(感謝返璞詞,下面,誰應該得到在這一個upvotes)

def foo(xs: Map[T, T] forSome { type T}) 

這裏的關鍵是,我可以使用存在一個以上的地方,但是一樣的existential。顯然,如果你使用的是通配符,你可能會提到不同的存在

+0

在這個例子中,沒有。說實話,我不是100%確定它是有效的語法,並沒有機會檢查。但我已經看到類似的例子 – 2012-02-26 16:37:41

+0

事實上,我只是用scala 2.9.1試過,而且它不能編譯**!你能解決它嗎,我不能爲你做,我從來沒有使用/需要'forSome'構造。 – paradigmatic 2012-02-26 16:54:19

+0

根據反光詞建議的線條修正 – 2012-02-26 18:04:16

14

_在此上下文中是「存在類型的佔位符語法」,如language specification的3.2.10中所述。

名稱聽起來很像另一個使用_「匿名函數的佔位符語法」。這種簡寫不能用於所有功能。例如:

(a: A) => f(g(a)) 
f(g(_: A)) // WRONG, this means f((a: A) => g(a)) 

我們可以構造爲existentials一個類似的例子,這是不能被表示_

F[G[A]] forSome { type A } 
F[G[_]] // WRONG, this means F[G[A] forSome { type A }] 

邊注:existentials是的值電平函數的類型電平模擬。這將是:

({type l[A] = F[G[A]])#l 

其實這是一個遺憾,斯卡拉用來existentials下劃線,而不是類型級別的功能。

UPDATE

讓我以同樣的方式幀@oxbow_lakes的回答:

(a: A) => h(a, a) 
h(_, _) // WRONG, this means (a, b) => f(a, b) 

H[A, A] forSome { type A } 
H[_, _] // WRONG, this means H[A, B] forSome { type A; type B } 
+0

對於Some {type A}和F [G [A] for Some {type A}]的F [G [A]]有什麼區別? – user482745 2012-03-09 08:42:08

相關問題