6
type family Rep a
和
type family Rep :: * -> *
是相同的,但它似乎是有區別的
type family Rep a
type instance Rep Int = Char
-- ok
type family Rep :: * -> *
type instance Rep Int = Char
-- Expected kind * -> *, but got 'Int' instead
難道我只是絆了一Haskell擴展的bug,還是有一些點這種行爲?
重點是類型族不是'類型級函數'。他們是'家庭的類型'。您應該將值級別模式匹配和類型族實例聲明之間的語法相似性視爲重合 - 它們具有完全不同的語義(例如,嘗試編寫與構造函數'Left :: a - >或任何ab匹配的值級函數')。你已經目睹了這個差異的最小例子。第二類家庭基本上只是一個類型的同義詞,因爲它只能有一個實例。第一個是一個適當的類型家庭。 – user2407038
我希望我有一個簡單的方法來解釋「類型級函數」和「類型家族」之間的區別,但我沒有。不同之處在於,第一類家庭不能部分應用(當然,第二類也是不可能的,但第二類的使用是飽和應用,因爲它需要0個參數) - 換句話說,第一類家族沒有一種可以在Haskell類型系統中分配給它的類型。 – user2407038