2012-11-09 16 views
9

我很難理解更高類型與更高等級類型。種類非常簡單(感謝Haskell的文獻),我曾經認爲秩序在討論類型時就像善良,但顯然不是!我讀了維基百科文章無濟於事。那麼有人可以解釋什麼是排名?高級排名是什麼意思?更高級別的多態性?這是怎麼來的種類(如果有的話)?比較斯卡拉和哈斯克爾也會很棒。種類理論中的種類與等級

回答

11

排名的概念並不真正與種類的概念有關。

多態類型系統的等級描述了可能出現在類型中的哪個位置。在等級1型系統中,可能只出現在最外層,在等級2型系統中它們可能出現在一層嵌套等等。

因此,例如forall a. Show a => (a -> String) -> a -> String將是排名第一的類型,forall a. Show a => (forall b. Show b => b -> String) -> a -> String將是排名第二的類型。這兩種類型之間的區別在於,在第一種情況下,函數的第一個參數可以是任何使用一個可顯示參數並返回String的函數。因此,Int -> String類型的函數將是有效的第一個參數(如假設函數intToString),那麼類型forall a. Show a => a -> String的函數(如show)也是如此。在第二種情況下,只有forall a. Show a => a -> String類型的函數纔是有效參數,即show可以,但intToString不會。因此下面的函數將是第二類的法律功能,而不是第(其中++應該代表字符串連接):這裏的功能f應用於

higherRankedFunction(f, x) = f("hello") ++ f(x) ++ f(42) 

注意(可能)三種不同類型的論據。所以如果f是功能intToString這不起作用。

默認情況下,Haskell和Scala都是Rank-1(所以上述函數不能用這些語言編寫)。但是GHC包含一個語言擴展來支持Rank-2多態,而另一個支持任意n的Rank-n多態。

+0

難道我們不能說排名限定類型變量,而種類限定類型常量嗎? – didierc

+0

@didierc我不太清楚你的意思,但我不這麼認爲。類型變量和類型常量都有種類。 – sepp2k

+1

你可以在scala中輕鬆編碼排名較高的類型。見http://www.cs.ox.ac.uk/jeremy.gibbons/publications/scalagp.pdf,第7.2節。 –