通过将Monads转换为半群来重叠实例

时间:2013-03-27 12:55:10

标签: haskell

Monads通过

定义Semigroups
instance Monad m => Semigroup (m a) where
    (<>) = (>>)

使用FlexibleInstances。

如果我想以这种方式将Maybe a变成Semigroup我会跑 进入Intance重叠,因为Data.Semigroup定义了

instance Semigroup a => Semigroup (Maybe a)

什么是Haskell-解决类似问题的方式?

1 个答案:

答案 0 :(得分: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)