我有很多类型声明:构造一个类型
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
?
这与你的问题没有任何关系,但你可能想知道你不需要在'module SumProduct where'下面缩进所有东西。只需在第0列开始下一行,并且可以将所有顶级声明留在那里。 – dfeuer