6

MonadsSemigroups経由で定義

instance Monad m => Semigroup (m a) where
    (<>) = (>>)

FlexibleInstancesを使用します。

Maybe aそのようにしたい場合はSemigroup、Intanceオーバーラップに遭遇Data.Semigroupします。

instance Semigroup a => Semigroup (Maybe a)

Haskell-そのようなことを解決する方法は何ですか?

4

1 に答える 1

11

これらの問題を解決する一般的な方法は、newtypeラッパーを使用することです。を定義するのinstance Semigroup (m a)ではなく、

newtype WrappedMonad m a = WrappedMonad { getWrappedMonad :: m a }

instance Monad m => Semigroup (WrappedMonad m a) where
    WrappedMonad a <> WrappedMonad b = WrappedMonad (a >> b)
于 2013-03-27T13:32:24.680 に答える