2

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関数はコンパイルされません。それはまったく可能ですか?tellStructCollision

4

1 に答える 1