使用WriterT的自定义monoid

时间:2018-08-24 14:31:10

标签: haskell monads monad-transformers monoids

我正在尝试使用自定义数据类型实现WriterT。我已经按照runWriterT的要求实现了Monoid。但是我无法编译代码。我收到错误

无法推断(Semigroup(Env a))         由实例声明的超类产生       来自上下文:Num a

import Control.Monad
import Control.Monad.Trans.Reader
import Control.Monad.IO.Class
import Control.Monad.Trans.Writer
import Control.Monad.Trans
import Data.Monoid

newtype Env a = Env { getEnv :: a  }  deriving (Eq, Ord, Read, Show)


instance Num a => Monoid (Env a) where
  mempty = Env 0
  Env x  `mappend` Env y = Env (x + y)


writeSomething :: (Num a) => WriterT (Env a) IO ()
writeSomething = do
  tell $ Env 1
  tell $ Env 3

1 个答案:

答案 0 :(得分:5)

在最近的GHC中,SemigroupMonoid的超类,因此要正确创建Monoid的实例,还必须创建Semigroup的实例。幸运的是,它通常很短:

instance Num a => Semigroup (Env a) where (<>) = mappend