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

Mic*_*l T 5 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)
Run Code Online (Sandbox Code Playgroud)

如果我要创建一个诸如 - 的值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.
Run Code Online (Sandbox Code Playgroud)

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

dup*_*ode 10

正如Carsten在上面指出的那样,你的定义不起作用,因为你有两个同名的构造函数.你需要使用eg 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)
Run Code Online (Sandbox Code Playgroud)

  • `Maybe`是一些非常有用的东西的例子,比如`Functor`,`Applicative`,`Alternative`,`Monad`和`Traversable`. (2认同)