2014-02-05 25 views
3

這給了我下面的錯誤哈斯克爾類型同義詞問題

不在範圍:數據構造Blah

爲什麼?我以爲我可以使用類型同義詞,我到處都可以使用Person

data Person = Person { weight :: Int, height :: Int } 

type Blah = Person 

person1 :: Blah 
person1 = Blah 80 187 
+2

'Blah'是'Person'類型的別名,而不是'Person'構造函數的別名。 – Lee

回答

6

你的別名類型Person的名稱Blah,但Person構造仍然Person {weight :: Int, height :: Int}。類型構造函數和類型名稱是不同的,甚至保存在Haskell中的不同名稱空間中。

作爲一個例子:

> data MyBool = MyFalse | MyTrue deriving (Show, Eq) 
> type Blah = MyBool 

這裏MyBool構造函數是MyFalseMyTrue,每個種類*(無類型參數)。然後我別名MyBoolBlah

> MyTrue :: MyBool 
MyTrue 
> MyTrue :: Blah 
MyTrue 

這應該有助於加強的想法,而一類的構造函數可能共享相同的名稱作爲類型本身,他們是不一樣的東西。

2

在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保險業監督一個構造函數和兩者在不同的範圍。