我必须将Maybe
和Either
组合成MayEither
,其中有三个Left
、Right
和Nothing
的构造函数,分别称为MyLeft
、MyRight
和MyNothing
。
这就是我所做的:
data MayEither = Maybe { myNothing :: Nothing }
| Either { myLeft :: Left }
| Either { myRight :: Right } deriving Show
但是这给了我一个Multiple declarations of ‘Either’
错误,我如何正确地合并这些类型呢?
1条答案
按热度按时间jckbn6z71#
需要做两件事:
1.您需要为每个数据构造函数给予不同的名称。
1.您需要给予记录中字段的类型。
请注意,
Nothing
、Left
和Right
是Maybe
和Either
类型的 * 数据构造函数 *--它们本身并不是类型!因此,声称某个字段具有Nothing
类型是不完全正确的。类似地,Maybe
和Either
是类型构造函数,因此用它们来命名数据构造函数最多也是误导性的。在这种情况下几乎可以肯定是错误的。所以让我们再试一次。首先我们将选择新的数据构造函数名称。
那么,
myNothing
应该是什么类型呢?Nothing
/MyNothing
的全部意义在于,那里什么都没有。所以我们根本不应该有那个字段!myLeft
字段应该是什么类型?我们可能希望在其中可以有任何内容。实现这一点的方法是参数化我们的类型--就像Maybe
接受一个类型级参数,Either
接受两个类型级参数一样。我们将做Either
所做的,接受两个参数,从而我们的x1M15 N1 x和x1M16 N1 x字段可以是任意的并且不需要匹配。现在这是有效的Haskell。但是将记录语法和求和类型结合起来几乎总是一个坏主意。我想如果我自己这样做的话,我会完全放弃字段名。