我在创建数据类型时遇到了一个小问题。
我有两种数据类型,足球和网球
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作为构造函数创建另一个数据类型的运动,我得到以下错误,足球的多个声明--我不明白我做错了什么。
诚挚的问候
发布于 2017-08-21 08:07:39
您的想法在精神上是正确的,但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还是UntaggedLists?那么假设我们有另一个类似的定义:
data AnotherUntaggedLists = String | [String]UntaggedLists和AnotherUntaggedLists是相等的类型,这是真的吗?
这些并不是无法回答的问题,但它确实证明了有标签和没有标签之间有着深刻的系统性区别。
https://stackoverflow.com/questions/45791969
复制相似问题