我有两种类型,假设它们都有monoid实现。有没有办法让另一种类型指定包含X或Y?或者这不是正确的方法吗?
data X = X [Int]
data Y = Y Double
答案 0 :(得分:9)
OP已在评论中澄清他们希望某些类型Either X Y
的“实例行为”。通常,在这种情况下您使用newtype
:
newtype EitherXY = EitherXY (Either X Y)
如果您还不知道,newtypes
可以有类似记录的展开功能。
newtype EitherXY = EitherXY { unwrap :: Either X Y } deriving (...)
您也可以自动派生某些类型类(与数据声明一样)。可派生类的集合取决于编译器版本和已启用的扩展集。我不会elaborate在这里。
答案 1 :(得分:9)
最好只做
data X_Or_Y = InX X | InY Y
此类型与X Y同构,但使用/ pattern匹配比使用newtype更容易,因为它只有2层嵌套构造函数