Я пишу код, который использует монадный преобразователь StateT
для отслеживания некоторой информации о состоянии (логирование и т. д.).
Монада, которую я передаю StateT
, очень проста:
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
. В своих вычислениях я получаю много информации внутри этой монады, и я хотел бы сохранить эту информацию даже в случае сбоя. В настоящее время единственное, что я могу сделать, это преобразовать все в String
и создать экземпляр Bad
с String
, переданным в качестве аргумента для fail
.
Я хотел бы сделать что-то вроде:
fail msg = do
info <- getInfoOutOfTheComputation
return $ Bad info
Однако все, что я пробовал до сих пор, дает ошибки типа, вероятно, потому, что это смешивает разные монады.
Могу ли я каким-либо образом реализовать fail
, чтобы сохранить нужную мне информацию, не преобразовывая ее всю в String
?
Я не могу поверить, что лучшее, чего может достичь Haskell, это использовать show
+read
для передачи всей информации в виде строки в fail
.
fail
не для этого, поэтому, конечно, это не работает. - person Carl   schedule 17.04.2014fail
и не достигают числа 2. В настоящее время единственное, что я придумал, это:prettyFail = do state <- get; fail $ show state
реализацияShow
иRead
во всей информации о состоянии, что я не думаю, что это элегантно решение (хотя оно прекрасно работает). - person Bakuriu   schedule 17.04.2014fail
предназначен только в качестве временной меры для поддержки сбоев сопоставления с образцом в нотации do. - person   schedule 17.04.2014