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
.