Monads通过定义Semigroups
instance Monad m => Semigroup (m a) where
(<>) = (>>)使用FlexibleInstances。
如果我想以这种方式将Maybe a转换为Semigroup,我会遇到一个临时重叠,因为Data.Semigroup定义了一个
instance Semigroup a => Semigroup (Maybe a)解决这类问题的Haskell方法是什么?
发布于 2013-03-27 21:32:25
解决这些问题的常用方法是使用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)https://stackoverflow.com/questions/15659343
复制相似问题