haskell - 为什么我不能在不同的数据类型之间重用相同的值构造函数?

标签 haskell algebraic-data-types user-defined-data-types value-constructor

我是 Haskell 的新手,可能在这里遗漏了一些非常基本的东西,但我无法在不同的数据类型之间重用相同的值构造函数。

data Colour = Red | Pink | Orange | Yellow
data Fruit  = Apple | Orange | Banana

这会产生错误说
Multiple declarations of ‘Orange’
不知道为什么不允许这样做,我在学习 Haskell 之前一直在使用 OCaml,并且能够定义这样的类型

最佳答案

作为一个快速练习,尝试定义一种数据类型,然后打开 GHCi 进行检查。

data Colour = Red | Pink | Orange | Yellow

如果您使用 :t在 GHCi 中,它会告诉你任何东西的类型。
> :t Red
Red :: Colour
> :t Orange 
Orange :: Colour 

所以这告诉你你的数据构造函数 Orange实际上只是一个不带参数并产生 Colour 类型值的函数.

那么如果添加重复声明会发生什么?
data Colour = Red | Pink | Orange | Yellow
data Fruit  = Apple | Orange | Banana

现在你已经定义了一个函数 Orange不带参数并产生类型为 Colour 的值或 Fruit 类型的值.这根本行不通!这与定义您自己的自定义函数 foo 相同。并给它多个类型签名:
foo :: Int 
foo :: String
foo = "6"

这显然也不起作用。

为了解决这个问题,您可以在其自己的模块中定义每种数据类型,并使用合格的导入来正确地确定它们的范围:
import qualified Colour as C -- Module Colour.hs 
import qualified Fruit as F -- Module Fruit.hs 

orange1 = C.Orange :: C.Colour 
orange2 = F.Orange :: F.Fruit

现在,您可能会想“编译器很聪明,它应该知道 Orange 我在使用它时在说什么。”你会部分正确。正在努力将 Overloaded 或 Duplicate 记录字段引入 Haskell。这里已经定义了类似的各种其他问题,但我会列出一些
供进一步阅读的引用资料。
  • Why DuplicateRecordFields cannot have type inference?
  • https://github.com/adamgundry/ghc-proposals/blob/overloaded-record-fields/proposals/0000-overloaded-record-fields.rst
  • https://ghc.haskell.org/trac/ghc/wiki/Records/OverloadedRecordFields/DuplicateRecordFields
  • 关于haskell - 为什么我不能在不同的数据类型之间重用相同的值构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51597063/

    相关文章:

    haskell - 在 Haskell 中定义一个函数的 2 个或多个方程可以共享相同的 where/let block 吗?

    racket - 你如何使用代数 Racket 解构 let 绑定(bind)中的值

    typescript - 如何查看 Typescript 类型的完整扩展合约?

    ADT 上的 Scala 模式匹配可能不会对无法访问的代码发出警告

    c# - 如果我添加 2 个 double 数据类型值,结果四舍五入并打印。我如何获得 double 的精确输出?

    c - 如何访问用户定义数据类型的数组元素? (C)

    python - 在 python-numpy 中定义自定义 float8 并从/到 float16 转换?

    haskell - 在 Haskell 中编译大型数据结构

    haskell - 为 Reader r 编写 Applicative 实例时如何编写 <*>

    haskell - 对于未标记的树, `unfold` 的正确定义是什么?