我有以下数据类型和半组实例:
data Or a b =
Fst a
| Snd b deriving (Eq, Show)
instance Semigroup (Or a b) where
(<>) (Fst a) (Fst b) = Fst b
(<>) (Snd a) (Fst b) = Snd a
(<>) (Fst a) (Snd b) = Snd b
(<>) (Snd a) (Snd b) = Snd a
我想为上述类型制作一个幺半群实例,但我不知道该怎么做。如果我使用以下定义
instance (Monoid a, Monoid b) => Monoid (Or a b) where
mempty = (Fst mempty)
mappend = (<>)
它适用于所有输入对<>
,除了我mappend
(Fst a) <> mempty
这将评估为mempty
.
我该如何解决这个问题以使其mempty
有效?似乎没有一些新的语法或概念就无法完成,因为它取决于 mempty 是在左边还是右边......