Пользовательский моноид с WriterT - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь реализовать WriterT с пользовательским типом данных.Я реализовал моноид, как того требует runWriterT.Но я не могу скомпилировать код.Я получаю ошибку

Не удалось вывести (полугруппа (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 голосов
/ 24 августа 2018

В последних GHC Semigroup является суперклассом Monoid, поэтому для правильного создания экземпляра Monoid необходимо также создать экземпляр Semigroup. К счастью это вообще довольно коротко:

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