次のデータ型とセミグループ インスタンスがあります。
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が左か右かによって決まるため、新しい構文や概念がないとできないようです...