Monad Transformers を使用して、Writer モナドを 2 回入れ子にしようとしています。ここにスケッチがあります:
import Control.Monad.Identity
import Control.Monad.Writer
data Struct = S Bool
instance Monoid Struct where
mempty = S True
mappend (S a) (S b) = S (a && b)
data Collision = C Bool
instance Monoid Collision where
mempty = C False
mappend (C a) (C b) = C (a || b)
type CSInt = WriterT Collision (WriterT Struct Identity) Int
foo :: Int -> CSInt
foo x = do (tell (S False)) ; return x
ではなくモナドで使用する必要があるため、foo
関数はコンパイルされません。それはまったく可能ですか?tell
Struct
Collision