【问题标题】:Haskell: Multiple declaration of datatype [duplicate]Haskell:数据类型的多重声明
【发布时间】:2017-08-21 16:20:27
【问题描述】:

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

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

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

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

我想创建一个其他数据类型 Sport 使用作为构造函数的数据类型足球和网球 data Sport a = Football a | Tennis a 我收到以下错误,多次声明 Football 我不明白我在做什么错。

最好的问候

【问题讨论】:

标签: haskell


【解决方案1】:

您的想法在精神上是正确的,但 Haskell 使用标记联合(也称为“可区分联合”、“不相交联合”、“变体”和“总和类型”)。这意味着您需要一个额外的标签来确定 Sport 是由 Football 构建的,还是由 Tennis 构建的。

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]

UntaggedListsAnotherUntaggedLists 真的是相同的类型吗?

这些不是无法回答的问题,但它确实展示了有标签和没有标签之间的深刻系统差异。

【讨论】:

  • 谢谢我的朋友!美丽的答案:)
猜你喜欢
  • 2015-12-09
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 2022-08-12
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多