2017-06-16 47 views
1

我有很多類型聲明:構造一個類型

module SumProduct where 


    data GuessWhat = Chickenbutt deriving (Eq, Show) 

    data Id a = MkId a deriving (Eq, Show) 

    data Product a b = Product a b deriving (Eq, Show) 

    data Sum a b = First a 
       | Second b 
       deriving (Eq, Show) 

    data RecordProduct a b = RecordProduct { pfirst :: a , psecond :: b } 
          deriving (Eq, Show) 


    newtype NumCow = NumCow Int deriving (Eq, Show) 

    newtype NumPig = NumPig Int deriving (Eq, Show) 

    data Farmhouse = Farmhouse NumCow NumPig deriving (Eq, Show) 
    type Farmhouse' = Product NumCow NumPig 


    newtype NumSheep = NumSheep Int deriving (Eq, Show) 

    data BigFarmhouse = BigFarmhouse NumCow NumPig NumSheep deriving (Eq, Show) 
    type BigFarmhouse' = Product NumCow (Product NumPig NumSheep) 

    type Name = String 
    type Age = Int 
    type LovesMud = Bool 


    type PoundsOfWool = Int 
    data CowInfo = CowInfo Name Age 
       deriving (Eq, Show) 

    data PigInfo = PigInfo Name Age LovesMud deriving (Eq, Show) 

    data SheepInfo = SheepInfo Name Age PoundsOfWool deriving (Eq, Show) 


    data Animal = Cow CowInfo 
       | Pig PigInfo 
       | Sheep SheepInfo 
       deriving (Eq, Show) 


    type Animal' = Sum CowInfo (Sum PigInfo SheepInfo)(Sum PigInfo SheepInfo) 

而且與前奏玩:

Prelude> let bess = First (CowInfo "Bess" 4) :: Animal' 
Prelude> let elmer' = Second (SheepInfo "Elmer" 5 5) 

怎麼弄,第一變型bess :: Animal'和第二elmer' :: Sum a SheepInfo

+1

這與你的問題沒有任何關係,但你可能想知道你不需要在'module SumProduct where'下面縮進所有東西。只需在第0列開始下一行,並且可以將所有頂級聲明留在那裏。 – dfeuer

回答

5

默認情況下,Haskell推斷應用於表達式的最一般類型。

在這裏,你直接告訴GHC bess是什麼類型,所以它只是檢查你提供的類型是否有效,但允許它比最一般的類型更具體。

因爲你明確告訴GHC是bess已經由::操作輸入Animal'(這是一個語言結構,而不是在標準庫中定義的實際操作),GHC已經知道bess :: Animal'。但是,因爲您沒有提供任何類型的elmer',GHC會爲您找到最一般的類型。

在這種情況下,最普遍的類型是Sum a SheepInfo因爲所有GHC知道的是,Second構造需要SheepInfo,但沒有什麼First應採取的想法。因此,它將其推斷爲類型變量a

+0

對於最「最普通的類型」,你是什麼意思,你能舉一個例子嗎? –

+0

我稱之爲最普通的類型是假設數據信息較少的類型。例如,當你在Haskell中鍵入一個數字文字時,比如'23',它被推斷爲'Num a => a'。這就是爲什麼你可以做'2 * 0.5':'2'不是'Int',而是適應右邊的數字,在這種情況下,它是一個浮點數。 – baxbaxwalanuksiwe