我正在编写一些使用StateT
monad 转换器来跟踪一些有状态信息(日志记录等)的代码。
我传递给的 monadStateT
非常简单:
data CheckerError a = Bad {errorMessage :: Log} | Good a
deriving (Eq, Show)
instance Monad CheckerError where
return x = Good x
fail msg = Bad msg
(Bad msg) >>= f = Bad msg
(Good x) >>= f = f x
type CheckerMonad a = StateT CheckerState CheckerError a
它只是一个Left
和Right
变体。
困扰我的是fail
. 在我的计算中,我在这个 monad 中产生了很多信息,即使失败,我也想保留这些信息。目前,我唯一能做的就是将所有内容转换为 aString
并创建一个Bad
实例,并将String
作为参数传递给fail
.
我想做的是:
fail msg = do
info <- getInfoOutOfTheComputation
return $ Bad info
然而,到目前为止我尝试的所有内容都会出现类型错误,可能是因为这会混合不同的单子。
无论如何我可以实施fail
以保留我需要的信息而不必将所有信息转换为String
?
我无法相信 Haskell 可以实现的最佳效果是使用show
+read
将所有信息作为字符串传递给fail
.