一つは、右のモナドにlift操作に必要です。単一liftここと悪いありませんが、時にはこのように見えるの機能があります。 fun = do
lift a
lift b
c
lift d
lift e
f
私はこのように、この関数を記述できるようにしたいと思います: fun = monadInvert $ do
a
私はウェブアプリを書くことで遊んでいます。この場合、私はscottyとredisを使用していますが、この問題はどのWeb/dbコンボでも発生します。私はこれの前にハッシュスタックを使用していたので、そこにも例が大好きです。 スコッティは、あなたがルート内のデータベース接続へのアクセスが容易になり、ネストされたモナド、中にルートを定義していますWeb.Scotty.ActionM(): main =
単純なモナドトランスEntityBuilderTが定義されています。これはちょうどReaderTより新しいタイプです。 data EntityBuilderState = ...
newtype EntityBuilderT m a = EntityBuilderT (ReaderT EntityBuilderState m a)
は、私は次のコンビネータを書かれている、新しい「環境」の機
バランスブラケットの問題を解決しようとしています。私は連続IOをしたくないので、むしろgetLineを1回呼び出して、結果の文字列を解析します。したがって、問題を解決する関数は、2つの異なる状態、すなわち入力文字列の消費されていない部分とブラケットスタックを処理します。 私は、スタック操作するためのいくつかの機能を設定したい:しかし、私はStateTモナドで動作しています、 type Stack
現在、私はListTモナドトランスを多用しているプロジェクトを書いています。プレーン・リストを使用する場合、非決定性の実装は非常に簡単です。しかし、一度コードをListTに変換しなければならないと、はるかに複雑になりました。。 簡単な例として:ListT aに[a]からの変換は、実際には2つの機能を構成する必要があります。 conv :: (Monad m) => [a] -> ListT m a
私はHaskellでエラーを処理するために次のモナドトランスフォーマーを持っています。 instance (Monad m, Error e) => Monad (EitherT e m) where
return = EitherT . return . return
m >>= k = EitherT $ do
a <- runEitherT m