私が解決したいタスクから始めましょう、おそらく私は間違った方向に進んでいます。私はおもちゃのプロジェクトにSnapフレームワークを使用していますが、主なものはSnap
モナドの下で機能することです。その上に自分の状態を追加する必要があります。私はモナド変換子を使用します:
type SnapApp a = StateT AppState Snap a
これは、モジュールで定義されていますBase
。他のモジュールで必要なので、エクスポートする必要があります。
module Base
( ..
, SnapApp
) where
SnapApp
これは良いことですが、状態の属性を設定するための複雑な処理があるため、状態モナドであるモジュールをエクスポートしないようにします。たとえば、セッション。変更されたときにファイルを書き込まなければならないので、変更されたセッションget
よりも間違っているのでput
、特別な関数を呼び出す必要があります。だから、私newtype
はデータをエクスポートするコンストラクタではなく、それを使用することを隠します:
newtype SnapApp a = SnapApp (StateT AppState Snap a)
セッションなどを変更するための関数を使用してクラスのインスタンスにしました。しかし、問題が発生します。Monad
新しいためにクラスやその他のインスタンスを失いましSnapApp
た。そして、私は実装に固執しています>>=
:
instance Monad SnapApp where
return = SnapApp . return
mx >>= fm = -- HOW?
ありがとうございました!