Haskell:数据类型的多个声明

Haskell:数据类型的多个声明,haskell,Haskell,我在创建数据类型时遇到了一个小问题 我有两种数据类型,足球和网球 data Football a = Football { players :: Players a , Stadium :: Stadium a } data Tennis a = Tennis { players1 :: Players a , Stadium1 :: Stadium a } 我想创建另一个数据类型Sport

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

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

data Football a  = Football
  { players       :: Players a    
  , Stadium       :: Stadium  a
  }     

data Tennis a  = Tennis
  { players1      :: Players a    
  , Stadium1      :: Stadium  a
  }
我想创建另一个数据类型Sport,使用数据类型football And tennis作为构造器
data Sport a=足球a |网球a
我得到了以下错误,我不明白我做错了什么


致以最诚挚的问候

您的想法在精神上是正确的,但Haskell使用标记的联合(也称为“有区别的联合”、“不联合的联合”、“变体”和“总和类型”)。这意味着您需要一个附加标记来确定运动是由足球构成的,还是由网球构成的

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

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

data UntaggedInt = Int | Int
未标记的并集应具有属性
(x | x)=x
,因此这必须等效于:

data UntaggedInt = Int
而对于标记的联合,我们可以定义:

data TaggedInt = This Int | That Int
也就是说,标记的并集不是幂等的

还考虑没有构造函数发生的其他事情。假设我们有如下定义:

data UntaggedLists = String | [String]
现在我们的任务是查找表达式的类型
“hello world”
。类型应该是
String
还是
untagedlist
?那么假设我们有另一个类似的定义:

data AnotherUntaggedLists = String | [String]
untagedlist
和另一个untagedlist是相同类型的吗


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

你制作了一个构造函数
Football::Players a->Stadium a->Football a
,现在您又添加了一个构造函数
Football::Sport
。还要注意,记录字段名称必须是小写:
Stadium
不能是字段。我通过添加Sport a=Football a | Tennis a纠正了我的错误,但问题仍然存在其他潜在的重复项:,谢谢我的朋友!漂亮的回答:)