Если вы определили f2
, самый простой из возможных подходов - рефакторинг f2
, поэтому он определяется следующим образом:
f2 :: Monad m => WriterT [String] m b
Что не должно быть слишком сложно, поскольку Writer w b
определяется какWriterT w Identity b
, а монада Identity
ничего вам не дает.
Тогда вы сможете связать их, просто набрав f1 >> f2
.
Если вы не можетепереопределив f2
, вы всегда можете определить свою собственную с соответствующей сигнатурой:
f2' :: Monad m => WriterT [String] m b
f2' = WriterT . return $ runWriter f2
И если у вас есть набор f2
для переноса, вы всегда можете определить функцию для переноса их для вас
wrap :: Monad m => Writer w b -> WriterT w m b
wrap = WriterT . return . runWriter
Так что вы можете сделать f1 >> wrap f2a >> wrap f2b >> wrap f2c ...