我有很多类型声明:
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
发布于 2017-06-16 23:27:25
默认情况下,Haskell会推断出适用于表达式的最通用类型。
在这里,您直接告诉GHC bess
是什么类型,所以它只检查您提供的类型是否有效,但允许它比最通用的类型更具体。
由于您显式地告诉GHC bess
通过::
运算符(它是一种语言构造,而不是标准库中定义的实际运算符)具有类型Animal'
,因此GHC已经知道该bess :: Animal'
。但是,因为您没有为elmer'
提供任何类型,所以GHC将为您找到最通用的类型。
在本例中,最通用的类型是Sum a SheepInfo
,因为GHC只知道Second
构造函数接受SheepInfo
,但不知道First
应该接受什么。因此,它将其推断为类型变量a
。
https://stackoverflow.com/questions/44592257
复制相似问题