這給了我下面的錯誤哈斯克爾類型同義詞問題
不在範圍:數據構造
Blah
爲什麼?我以爲我可以使用類型同義詞,我到處都可以使用Person
data Person = Person { weight :: Int, height :: Int }
type Blah = Person
person1 :: Blah
person1 = Blah 80 187
這給了我下面的錯誤哈斯克爾類型同義詞問題
不在範圍:數據構造
Blah
爲什麼?我以爲我可以使用類型同義詞,我到處都可以使用Person
data Person = Person { weight :: Int, height :: Int }
type Blah = Person
person1 :: Blah
person1 = Blah 80 187
你的別名類型Person
的名稱Blah
,但Person
構造仍然Person {weight :: Int, height :: Int}
。類型構造函數和類型名稱是不同的,甚至保存在Haskell中的不同名稱空間中。
作爲一個例子:
> data MyBool = MyFalse | MyTrue deriving (Show, Eq)
> type Blah = MyBool
這裏MyBool
構造函數是MyFalse
和MyTrue
,每個種類*
(無類型參數)。然後我別名MyBool
到Blah
:
> MyTrue :: MyBool
MyTrue
> MyTrue :: Blah
MyTrue
這應該有助於加強的想法,而一類的構造函數可能共享相同的名稱作爲類型本身,他們是不一樣的東西。
在GHC 7.8,你可以以這樣的方式寫最熱:
{-# LANGUAGE PatternSynonyms #-}
data Person = Person { weight :: Int, height :: Int }
type Bar = Person -- type synonym
pattern Baz = Person -- constructor synonym
person1 :: Bar
person1 = Baz 80 187
但肯定的是,不要忘記Person
是一個類型,Person
保險業監督一個構造函數和兩者在不同的範圍。
'Blah'是'Person'類型的別名,而不是'Person'構造函數的別名。 – Lee