問題タブ [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.
haskell - Haskell の終了状態モナドを早期に (ガード?)
私は自分のアプリケーションのゲーム状態を表す型を持っています。
State モナドでゲームロジックを定義します。
一部の入力を単純に破棄できるようにしたい
このような構文が必要です
ガードに当たってしまったらそのまま放置して、ブロック内は何もしないようにしたいです。
どうすればいいですか?MonadPlus でほぼ可能に思えますが、mzero を使用して「状態に既にあるものを返す」ことができるかどうかはわかりません。ありがとう!
haskell - ReaderT を使用して変更可能な環境を作成する
私は、チュートリアルのWrite Yourself A Scheme をフォローして拡張してきました。LispVal
モナドトランスフォーマーのいくつかのレイヤーにラップされた型があります。
using のアイデアReaderT
は、エバリュエーターを介して (変数バインディングを維持する) 環境を自動的に渡すことができるということask
です。これは、追加のパラメーターとして環境を明示的に渡すよりも望ましいようです。ContT
継続を実装するときは、モナド変換子で同様のトリックを行い、継続のための余分な引数を渡さないようにしたいと思います。
ただし、これを行うことで環境を変更する方法がわかりません。たとえば、新しい変数を定義したり、古い変数の値を設定したりします。
it
具体的な例として、if ステートメントを評価するたびに、変数をテスト句の結果にバインドしたいとします。私の最初の考えは、環境を直接変更することでした:
aを anytruthVal
に代入する関数を次に示します。しかし、環境を変更するように関数を記述する方法がわかりません。Bool
LispVal
bind
私の2番目の考えは、使用することでしたlocal
:
しかし、ここでbind
は type が必要でEnv -> Env
あり、環境内で s を値として使用してIORef
いるため、署名付きの関数しか記述できませんEnv -> IO Env
。
これは可能ですかStateT
、代わりに使用する必要がありReaderT
ますか?
haskell - ResourceT で問題を解決する
この例、特にクライアントを適応させています。コードとそれが生成するエラーに従って、問題が何であると私が思うかをお話しします。
ここに問題があります。エラーは Control.Monad.Trans.Class.MonadTrans ResourceT のインスタンスがないことを示しています
しかし、このドキュメントのおかげで、あると思います。では、どこで問題が発生したのでしょうか。
以下で述べたように、何かジャンクが起こっていますControl.Monad.Trans.Resource
ResourceT
イントロスペクションの結果がこちら。
のバージョンresourcet
は
続行する方法についてのアイデアはありますか?MonadTrans ResourceT のインスタンスはどこにありますか?
haskell - ContTをMonadErrorのインスタンスにできないのはなぜですか?
を含むモナド変換子スタックがあり、全体ErrorT
に変圧器を巻き付けたいと思います。ContT r
これを実行しようとすると、throwError
タイプエラーを生成するための呼び出しContT r
は、自動的にのインスタンスではないようですMonadError
。いいでしょう、私は思った-私はそれを1つにするだけだ:
の適切な定義を使用しliftCatch
ます。しかし、コンパイル時にエラーが発生するようになりました。
UndecidableInstancesプラグマを使用できてうれしいです(あまり気にならないという印象を受けています。たとえば、この質問を参照してください)が、継続トランスフォーマーをインスタンスにするのは難しいのではMonadError
ないかと思いました。結構です、Control.Monad.Trans
パッケージの作者はすでにそれをしているでしょう...そうですか?
scala - この構成を単純化するためにモナド変換子を使用できますか?
私が持っていると仮定します
タイプの結果を取得したいのですVS[Option[B]]
が、v
が a のSuccess(None)
場合、結果もSuccess(None)
. 次に例を示します。
それで:
成功例は次のとおりです。
空のケースは次のとおりです。
これを行うための「より良い」方法はありますか (おそらく kleisli コンポジションまたはモナド トランスフォーマーを含む)?
haskell - Haskellモナドの繰り返し呼び出し
次のように宣言されたモナドを返す Haskell 関数があります。
この関数は、1 ゲームのソリティアをプレイし、勝敗を示すブール値とWriterT
モナドのログを返します。
この関数を一定回数呼び出したいと思います。そのたびに、ランダム ジェネレーターの「次の」値 ( ) を使用し、戻り値をリストにStdGen
連結します。Bool
呼び出しを行う再帰関数を作成しようとしましたが、モナドを次の各反復に渡す方法がわかりません。
真似したい
結果のすべての値と、モナドBool
からのログエントリを収集します。WriterT
これを行う最善の方法は何ですか?
f# - F#で状態モナドと継続モナドを組み合わせる方法
タスク並列ライブラリを使用してツリーを合計しようとしています。このライブラリでは、ツリーが特定の深さまでトラバースされるまで子タスクが生成されます。それ以外の場合は、スタックオーバーフローを回避するために、継続パススタイルを使用して残りの子ノードが合計されます。
ただし、コードはかなり醜いように見えます。状態モナドを使用して現在の深さを運ぶのは良いことですが、状態モナドは末尾再帰ではありません。または、州を持ち歩くために継続モナドをどのように変更しますか?または、状態モナドと継続モナドの組み合わせを作成しますか?
このブログ投稿についてもう少し詳しく説明します:http://taumuon-jabuka.blogspot.co.uk/2012/06/more-playing-with-monads.html
haskell - エイリアシングのための正しい制御モナド
ユーザーIDを返すモナド関数があります:
getUserId で、getUserId によって返される値のエイリアスを検索して返す関数を「スーパーインポーズ」できる必要があります。
明らかに、特定の関数 getAlias を作成し、モナド自体を書き直すことができます。
しかし、モナドのバインド関数に getAlias を隠すことで、これをより一般的に、再利用可能に、目に見えないようにできると思います。
モナドトランスフォーマーはこの機能を実行しますか、つまり、内部モナドのバインド関数を外部モナドのバインド関数で構成しますか? それとも、ここで他の制御構造が必要ですか?
haskell - IO と一緒に StateT モナドを実際に実行するにはどうすればよいですか?
IO モナドと一緒に AppState を構築するために、状態と IO アクションを組み合わせるで与えられたアドバイスに従おうとしています。私が得たのはこれです:
これのいくつかの部分が得られていません。script
私がとmyMain
と を持っていることは非常に気になりmain
ます。runState
また、内部で実行する必要があり、メイン関数にmyMain
初期状態をフィードする必要があることも気になります。runStateT
myMain の全体的なポイントは、追加と合計を myMain で直接、印刷操作のすぐ隣で実行できるようにすることであるため、いわば「スクリプト」を myMain 関数で直接使用したいと考えています。代わりに、これを行うことができるはずだと思います:
モナドトランスフォーマーのポイントは、State モナド操作を関数 (上記のように) で実行し、IO 操作をその関数に持ち上げることだと考えていました。間接的なレイヤーの 1 つを削除できるように、これらすべてを設定する正しい方法は何ですか?
ダニエルの解決策 (私は解決策にフラグを立てました) に加えて、状況に光を当てる可能性のあるいくつかのバリエーションも見つけました。まず、myMain と main の最終的な実装:
現在、ダニエルの実装に加えて、append と sumST のさまざまな実装:
および (型宣言のみが変更されることに注意してください。実際、型宣言を完全に省略できます!)
AppState/StateT モナドが基本的な State モナドと同じではないことに気がつき、State モナドに対して sumST と append の両方をコーディングしていました。ある意味では、これらは StateT モナドに持ち上げる必要もありましたが、 in の正しい考え方は、モナドで実行する必要があるということです(したがって、runState script new
)。
完全に理解しているかどうかはわかりませんが、しばらく作業して、MonadState コードを読み、最終的に頭の中で動作するようになったら、これについて何かを書きます。
haskell - Pipes-2.1.0 パッケージでのファイナライズ
Pipes-2.1.0 パッケージと zeromq3-haskell パッケージを使用して、小さなメッセージ パイプラインを構築しています。フレームのファイナライズを理解するのに問題があることを除けば、すべてうまくいっているようです。
次のフレームでは、2 つのリソースを取得します。zeromq コンテキストと zeromq ソケット。次に、メッセージ (の形式ByteStrings
) が zeromq ソケットに公開されるのを待ち続けます。
今私がこれを試してみると:
私はこれを得る:
publisher
1つだけ受け取った後に確定しBytesString
ます。
なぜこうなった?
Pipes-2.1.0 のフレームを使用したファイナライズについて誤解しているのは何ですか?
攻撃を開始した場合、外の木にチャンスはありますか?