允许多个数据构造函数声明

时间:2015-09-04 04:05:27

标签: haskell

我目前正在试验数据类型,我遇到了涉及数据构造函数的多个声明的问题。

data DBPosition = Unknown
                | Omega Integer
                | Delta Integer
                deriving (Show, Eq, Ord)

data DBGeometry = Unknown | Cis | Trans
                deriving (Show, Eq, Ord)

data DoubleBond = DoubleBond DBPosition DBGeometry
                deriving (Show, Eq, Ord)

如果我要创建一个类似 - let bond = DoubleBond Unknown Unknown的值,那么可以推断出第一个Unknown的类型为DBPosition,而第二个Unknown一种DBPosition。不幸的是情况并非如此:

test.hs:6:27:
Multiple declarations of `Unknown'
Declared at: test.hs:1:27
             test.hs:6:27
Failed, modules loaded: none.

是否有可用于解决此问题的语言扩展?

1 个答案:

答案 0 :(得分:9)

正如Carsten在上面指出的那样,你的定义不起作用,因为你有两个同名的构造函数。你需要使用例如UnknownDBPositionUnknownDBGeometry。但是,我认为更好的解决方案来自于认识:

  • 无论你是在讨论双键位置,几何形状还是其他任何东西,未知值的概念都以完全相同的方式起作用;和
  • Unknown实际上并不是各种双键几何或位置。

既然如此,我建议您删除Unknown并使用Maybe来指定缺乏知识。

data DBPosition = Omega Integer
                | Delta Integer
                deriving (Show, Eq, Ord)

data DBGeometry = Cis | Trans
                deriving (Show, Eq, Ord)

data DoubleBond = DoubleBond (Maybe DBPosition) (Maybe DBGeometry)
                deriving (Show, Eq, Ord)