使用 WriterT 自定义幺半群
Custom monoid with WriterT
我正在尝试使用自定义数据类型实现 WriterT。我已经按照 runWriterT 的要求实现了幺半群。但是我无法编译代码。我收到一个错误
无法推导 (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
在最近的 GHC 中,Semigroup
是 Monoid
的超类,因此要正确创建 Monoid
的实例,您还必须创建 Semigroup
的实例。幸运的是它通常很短:
instance Num a => Semigroup (Env a) where (<>) = mappend
我正在尝试使用自定义数据类型实现 WriterT。我已经按照 runWriterT 的要求实现了幺半群。但是我无法编译代码。我收到一个错误
无法推导 (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
在最近的 GHC 中,Semigroup
是 Monoid
的超类,因此要正确创建 Monoid
的实例,您还必须创建 Semigroup
的实例。幸运的是它通常很短:
instance Num a => Semigroup (Env a) where (<>) = mappend