我目前正在试验数据类型,我遇到了涉及数据构造函数的多个声明的问题。
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.
是否有可用于解决此问题的语言扩展?
答案 0 :(得分:9)
正如Carsten在上面指出的那样,你的定义不起作用,因为你有两个同名的构造函数。你需要使用例如UnknownDBPosition
和UnknownDBGeometry
。但是,我认为更好的解决方案来自于认识:
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)