在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()
爲什麼理論上需要組合成各種形式之間的區別和類型的變量?
[這不是](https://typesandkinds.wordpress.com/2015/08/19/planned-change-to-ghc-merging-types-and-kinds/) – bheklilr
@bheklilr我認爲OP有些不同記住,雖然我不太明白。 –
如果啓用'PartialTypeSignatures',則可以將'_'替換爲類型變量。例如,'Nothing :: Maybe _'或'Left():: E_ _''。你的建議是一個簡單的語法擴展,但我不確定它不會引入更多的混淆(特別是在像PolyKinds這樣的其他擴展的情況下) – Alec