6

MonadsSemigroups通过定义

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

使用灵活实例。

如果我想以这种方式Maybe a变成一个Semigroup,我会遇到一个 Intance 重叠,因为Data.Semigroup定义了一个

instance Semigroup a => Semigroup (Maybe a)

解决此类问题的 Haskell 方法是什么?

4

1 回答 1

11

解决这些问题的常用方法是使用新类型包装器。你不会定义一个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 回答