Monads
通过
Semigroups
instance Monad m => Semigroup (m a) where
(<>) = (>>)
使用FlexibleInstances。
如果我想以这种方式将Maybe a
变成Semigroup
我会跑
进入Intance重叠,因为Data.Semigroup
定义了
instance Semigroup a => Semigroup (Maybe a)
什么是Haskell-解决类似问题的方式?
答案 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)