2016-08-24 62 views
4

在Haskell據我瞭解,有類型變量(例如:id :: a -> a),適用於類型簽名,並(前。Maybe :: * -> *),適用於類型構造和類型類。一個類型必須有*(是一個具體類型)以保存值。哈斯克爾多態性與種類和類型變量

我們使用類型變量來啓用多態:Nothing :: Maybe a意味着常量Nothing可以屬於一個可能類型的家族。這使我相信kinding和類型變量服務於相同的目的;最後的代碼示例不會像Nothing :: Maybe那樣工作,其中類型類Maybe可能仍然以類型* -> *表示該類型屬於通用族?

看起來我們正在做的是取一個空的參數(* -> *)並用類型變量(a)填充它表示相同的方差水平。

我們看到這種行爲在另一個例子:

>>> :k Either 
Either :: * -> * -> * 
>>> :t Left() 
Left() :: Either() b 
>>> :t Right() 
Right() :: Either a() 

爲什麼理論上需要組合成各種形式之間的區別和類型的變量?

+4

[這不是](https://typesandkinds.wordpress.com/2015/08/19/planned-change-to-ghc-merging-types-and-kinds/) – bheklilr

+2

@bheklilr我認爲OP有些不同記住,雖然我不太明白。 –

+0

如果啓用'PartialTypeSignatures',則可以將'_'替換爲類型變量。例如,'Nothing :: Maybe _'或'Left():: E_ _''。你的建議是一個簡單的語法擴展,但我不確定它不會引入更多的混淆(特別是在像PolyKinds這樣的其他擴展的情況下) – Alec

回答

5

它們與打字不同,而且通常(值級別)變量是不同的。變量類型,但他們不是類型。因此,類型變量也有種。類型變量是主要概念:沒有它們,你沒有參數多態性,並且它們也存在於許多其他語言中,例如Java,C#等。但是Haskell進一步允許類型參數([],Maybe->等)自己存在並且具有代表這種非具體類型的類型變量。這意味着它需要一個有用的系統來禁止諸如Maybe Int Int之類的東西。

從這個例子看來,你似乎建議你可以寫一個沒有類型變量的簽名,並將它恢復到簽名。但是,你怎麼能區分a -> b -> aa -> b -> b

+0

將類型和類型混合在一起很好。實際上,最新的ghc爲此提供了語言擴展。雖然,被視爲邏輯類型輸入必須非常仔細地處理,以避免不一致。但這對Haskell無關緊要。 – augustss