3

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

それは単なるLeftRightバリアントです。

私を悩ませているのは の定義ですfail。私の計算では、このモナド内で多くの情報を生成します。失敗した場合でも、この情報を保持したいと考えています。現在、私ができる唯一のことは、すべてを に変換し、 に引数として渡されたインスタンスをString作成することです。BadStringfail

私がやりたいことは次のようなものです:

fail msg = do
    info <- getInfoOutOfTheComputation
    return $ Bad info

ただし、これまでに試したことはすべて型エラーになります。これはおそらく、異なるモナドが混在するためです。

failとにかく、必要な情報をすべてに変換することなく保持するために実装できる方法はありStringますか?

Haskell が達成できる最善の方法は、 show+readを使用してすべての情報を文字列としてfail.

4

1 に答える 1