首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >构造一个类型

构造一个类型
EN

Stack Overflow用户
提问于 2017-06-16 22:52:12
回答 1查看 86关注 0票数 1

我有很多类型声明:

代码语言:javascript
运行
复制
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)

并在前奏中玩玩:

代码语言:javascript
运行
复制
Prelude> let bess = First (CowInfo "Bess" 4) :: Animal'
Prelude> let elmer' = Second (SheepInfo "Elmer" 5 5)

它是如何实现的,第一个变成了bess :: Animal'类型,第二个变成了elmer' :: Sum a SheepInfo

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44592257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档