問題タブ [monad-transformers]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
1206 参照

haskell - Haskell の終了状態モナドを早期に (ガード?)

私は自分のアプリケーションのゲーム状態を表す型を持っています。

State モナドでゲームロジックを定義します。

一部の入力を単純に破棄できるようにしたい

このような構文が必要です

ガードに当たってしまったらそのまま放置して、ブロック内は何もしないようにしたいです

どうすればいいですか?MonadPlus でほぼ可能に思えますが、mzero を使用して「状態に既にあるものを返す」ことができるかどうかはわかりません。ありがとう!

0 投票する
2 に答える
474 参照

haskell - ReaderT を使用して変更可能な環境を作成する

私は、チュートリアルのWrite Yourself A Scheme をフォローして拡張してきました。LispValモナドトランスフォーマーのいくつかのレイヤーにラップされた型があります。

using のアイデアReaderTは、エバリュエーターを介して (変数バインディングを維持する) 環境を自動的に渡すことができるということaskです。これは、追加のパラメーターとして環境を明示的に渡すよりも望ましいようです。ContT継続を実装するときは、モナド変換子で同様のトリックを行い、継続のための余分な引数を渡さないようにしたいと思います。

ただし、これを行うことで環境を変更する方法がわかりません。たとえば、新しい変数を定義したり、古い変数の値を設定したりします。

it具体的な例として、if ステートメントを評価するたびに、変数をテスト句の結果にバインドしたいとします。私の最初の考えは、環境を直接変更することでした:

aを anytruthValに代入する関数を次に示します。しかし、環境を変更するように関数を記述する方法がわかりません。BoolLispValbind

私の2番目の考えは、使用することでしたlocal:

しかし、ここでbindは type が必要でEnv -> Envあり、環境内で s を値として使用してIORefいるため、署名付きの関数しか記述できませんEnv -> IO Env

これは可能ですかStateT、代わりに使用する必要がありReaderTますか?

0 投票する
2 に答える
785 参照

haskell - ResourceT で問題を解決する

この例、特にクライアントを適応させています。コードとそれが生成するエラーに従って、問題が何であると私が思うかをお話しします。

ここに問題があります。エラーは Control.Monad.Trans.Class.MonadTrans ResourceT のインスタンスがないことを示しています

しかし、このドキュメントのおかげで、あると思います。では、どこで問題が発生したのでしょうか。

以下で述べたように、何かジャンクが起こっていますControl.Monad.Trans.Resource

ResourceTイントロスペクションの結果がこちら。

のバージョンresourcet

続行する方法についてのアイデアはありますか?MonadTrans ResourceT のインスタンスはどこにありますか?

0 投票する
1 に答える
440 参照

haskell - ContTをMonadErrorのインスタンスにできないのはなぜですか?

を含むモナド変換子スタックがあり、全体ErrorTに変圧器を巻き付けたいと思います。ContT rこれを実行しようとすると、throwErrorタイプエラーを生成するための呼び出しContT rは、自動的にのインスタンスではないようですMonadError。いいでしょう、私は思った-私はそれを1つにするだけだ:

の適切な定義を使用しliftCatchます。しかし、コンパイル時にエラーが発生するようになりました。

UndecidableInstancesプラグマを使用できてうれしいです(あまり気にならないという印象を受けています。たとえば、この質問を参照してください)が、継続トランスフォーマーをインスタンスにするのは難しいのではMonadErrorないかと思いました。結構です、Control.Monad.Transパッケージの作者はすでにそれをしているでしょう...そうですか?

0 投票する
1 に答える
1170 参照

scala - この構成を単純化するためにモナド変換子を使用できますか?

私が持っていると仮定します

タイプの結果を取得したいのですVS[Option[B]]が、vが a のSuccess(None)場合、結果もSuccess(None). 次に例を示します。

それで:

成功例は次のとおりです。

空のケースは次のとおりです。

これを行うための「より良い」方法はありますか (おそらく kleisli コンポジションまたはモナド トランスフォーマーを含む)?

0 投票する
1 に答える
2421 参照

haskell - Haskellモナドの繰り返し呼び出し

次のように宣言されたモナドを返す Haskell 関数があります。

この関数は、1 ゲームのソリティアをプレイし、勝敗を示すブール値とWriterTモナドのログを返します。

この関数を一定回数呼び出したいと思います。そのたびに、ランダム ジェネレーターの「次の」値 ( ) を使用し、戻り値をリストにStdGen連結します。Bool

呼び出しを行う再帰関数を作成しようとしましたが、モナドを次の各反復に渡す方法がわかりません。

真似したい

結果のすべての値と、モナドBoolからのログエントリを収集します。WriterT

これを行う最善の方法は何ですか?

0 投票する
2 に答える
533 参照

f# - F#で状態モナドと継続モナドを組み合わせる方法

タスク並列ライブラリを使用してツリーを合計しようとしています。このライブラリでは、ツリーが特定の深さまでトラバースされるまで子タスクが生成されます。それ以外の場合は、スタックオーバーフローを回避するために、継続パススタイルを使用して残りの子ノードが合計されます。

ただし、コードはかなり醜いように見えます。状態モナドを使用して現在の深さを運ぶのは良いことですが、状態モナドは末尾再帰ではありません。または、州を持ち歩くために継続モナドをどのように変更しますか?または、状態モナドと継続モナドの組み合わせを作成しますか?

このブログ投稿についてもう少し詳しく説明します:http://taumuon-jabuka.blogspot.co.uk/2012/06/more-playing-with-monads.html

0 投票する
1 に答える
133 参照

haskell - エイリアシングのための正しい制御モナド

ユーザーIDを返すモナド関数があります:

getUserId で、getUserId によって返される値のエイリアスを検索して返す関数を「スーパーインポーズ」できる必要があります。

明らかに、特定の関数 getAlias を作成し、モナド自体を書き直すことができます。

しかし、モナドのバインド関数に getAlias を隠すことで、これをより一般的に、再利用可能に、目に見えないようにできると思います。

モナドトランスフォーマーはこの機能を実行しますか、つまり、内部モナドのバインド関数を外部モナドのバインド関数で構成しますか? それとも、ここで他の制御構造が必要ですか?

0 投票する
1 に答える
1284 参照

haskell - IO と一緒に StateT モナドを実際に実行するにはどうすればよいですか?

IO モナドと一緒に AppState を構築するために、状態と IO アクションを組み合わせるで与えられたアドバイスに従おうとしています。私が得たのはこれです:

これのいくつかの部分が得られていません。script私がとmyMain を持っていることは非常に気になりmainます。runStateまた、内部で実行する必要があり、メイン関数にmyMain初期状態をフィードする必要があることも気になります。runStateTmyMain の全体的なポイントは、追加と合計を myMain で直接、印刷操作のすぐ隣で実行できるようにすることであるため、いわば「スクリプト」を myMain 関数で直接使用したいと考えています。代わりに、これを行うことができるはずだと思います:

モナドトランスフォーマーのポイントは、State モナド操作を関数 (上記のように) で実行し、IO 操作をその関数に持ち上げることだと考えていました。間接的なレイヤーの 1 つを削除できるように、これらすべてを設定する正しい方法は何ですか?


ダニエルの解決策 (私は解決策にフラグを立てました) に加えて、状況に光を当てる可能性のあるいくつかのバリエーションも見つけました。まず、myMain と main の最終的な実装:

現在、ダニエルの実装に加えて、append と sumST のさまざまな実装:

および (型宣言のみが変更されることに注意してください。実際、型宣言を完全に省略できます!)

AppState/StateT モナドが基本的な State モナドと同じではないことに気がつき、State モナドに対して sumST と append の両方をコーディングしていました。ある意味では、これらは StateT モナドに持ち上げる必要もありましたが、 in の正しい考え方は、モナドで実行する必要があるということです(したがって、runState script new)。

完全に理解しているかどうかはわかりませんが、しばらく作業して、MonadState コードを読み、最終的に頭の中で動作するようになったら、これについて何かを書きます。

0 投票する
1 に答える
178 参照

haskell - Pipes-2.1.0 パッケージでのファイナライズ

Pipes-2.1.0 パッケージと zeromq3-haskell パッケージを使用して、小さなメッセージ パイプラインを構築しています。フレームのファイナライズを理解するのに問題があることを除けば、すべてうまくいっているようです。

次のフレームでは、2 つのリソースを取得します。zeromq コンテキストと zeromq ソケット。次に、メッセージ (の形式ByteStrings) が zeromq ソケットに公開されるのを待ち続けます。

今私がこれを試してみると:

私はこれを得る:

publisher1つだけ受け取った後に確定しBytesStringます。

なぜこうなった?

Pipes-2.1.0 のフレームを使用したファイナライズについて誤解しているのは何ですか?

攻撃を開始した場合、外の木にチャンスはありますか?