首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Haskell:多个数据类型声明

Haskell:多个数据类型声明
EN

Stack Overflow用户
提问于 2017-08-21 07:59:41
回答 1查看 3K关注 0票数 5

我在创建数据类型时遇到了一个小问题。

我有两种数据类型,足球和网球

代码语言:javascript
运行
复制
data Football a  = Football
  { players       :: Players a    
  , Stadium       :: Stadium  a
  }     

data Tennis a  = Tennis
  { players1      :: Players a    
  , Stadium1      :: Stadium  a
  }

我想用数据类型足球和网球data Sport a = Football a | Tennis a作为构造函数创建另一个数据类型的运动,我得到以下错误,足球的多个声明--我不明白我做错了什么。

诚挚的问候

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-21 08:07:39

您的想法在精神上是正确的,但Haskell使用了标记的联合(也称为“受歧视的联合”、“不相交的联合”、“变体”和“和类型”)。这意味着你需要一个额外的标签来确定体育是用足球建造的,还是用网球建造的。

代码语言:javascript
运行
复制
data Sport = SportFootball Football | SportTennis Tennis

这些标记在Haskell中称为数据构造函数。也就是说,这定义了构造函数SportFootball :: Football -> Sport和构造函数SportTennis :: Tennis -> Sport

假设Haskell不需要这个额外的标记,那么这种类型是什么?

代码语言:javascript
运行
复制
data UntaggedInt = Int | Int

未标记的联合应该具有属性(x | x) = x,因此这必须等效于:

代码语言:javascript
运行
复制
data UntaggedInt = Int

然而,在有标记的工会中,我们可以定义:

代码语言:javascript
运行
复制
data TaggedInt = This Int | That Int

也就是说,被标记的工会并不是幂等的。

还可以考虑没有构造函数的其他事情。假设我们有一个定义,如:

代码语言:javascript
运行
复制
data UntaggedLists = String | [String]

现在我们的任务是查找表达式"hello world"的类型。类型是String还是UntaggedLists?那么假设我们有另一个类似的定义:

代码语言:javascript
运行
复制
data AnotherUntaggedLists = String | [String]

UntaggedListsAnotherUntaggedLists是相等的类型,这是真的吗?

这些并不是无法回答的问题,但它确实证明了有标签和没有标签之间有着深刻的系统性区别。

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

https://stackoverflow.com/questions/45791969

复制
相关文章

相似问题

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