問題タブ [state-monad]
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 の並列モナド マップ? parMapMのようなもの?
ST-Monad で 2 つの計算を並行して実行する方法を探しています。(STUArray を使用して) かなり大きな配列を構築していますが、それを並行して行いたいと考えています。
これまでのところ、これとこのQ&Aをstackoverflowで見つけましたが、最初のケースは純粋なコードのみを処理し、2番目はIOモナドを処理するため、私の場合には適用されません-しかし、私は状態スレッドにいます。
monad -parallelパッケージも見つけましたが、ST 用の「MonadParallel」のインスタンスが必要です。また、monad-parパッケージは、純粋な計算または IO モナドのみをサポートします。
ST 内で並列モナド計算を行う方法はありますか?
haskell - 連鎖状態の IO モナドに類似したモナドの作成
みんなこんにちは、
私は今年も Haskell にかなり慣れていません (1990 年代初頭に使用し、2000 年代初頭に使用した後)。Haskell Wiki に示されている IO モナドの例にほぼ直接類似したパターンを使用するコードを作成しようとしています。
(はい、これは IO の GHC 実装ではなく、単にそれを理解するための手段であることを知っています。) その理由は、私のアプリケーション (ゲーム) で、RealWorld
ここでの 2 つの異なる置換でこれを行う 2 つのパターンがあるためです。 . 1 つはゲームの状態であり、もう 1 つは単なるStdGen
乱数シードです。もちろん、次のようなタイプのペアが 2 つあります。
(はい、それらを 2 つのパラメーターを持つ 1 つのペアに抽象化することはできますが、私はそれを理解していません。) もちろん、 myWithGS a
およびWithRNG a
型 (型の同義語) がIO a
上記とまったく同じであることがわかります。
だから、ここに私が今持っている実際の作業コードの簡単な例があります:
これは、指定された範囲でランダムなペアを作成し、最終的な RNG シードを返します。私のメソッドの大部分はこのようなもので ( WithRNG
orWithGS
を使用)、連鎖状態を使用し、時にはr4
or r6
(またはgs4
など) に至ることさえあります。この例を次のように書きたいと思います...
...まだまったく同じメソッド シグネチャとセマンティクスを持っています。これは、この例を示す前述のチュートリアルに従って可能であるように思われます。
ご覧のとおり、これは上で行っていることとほぼ同じです ( let
" " 表記を " " に置き換えればwhere
)。
ただし、型シノニムからモナドを作成することはできません。(私は TypeSynonymInstances を試しましたが、 " instance Monad WithRNG where
" またはパラメーターを使用しても機能しないようです。 a を使用するnewtype
と、役に立たない醜い構文が追加されるようです。) State Monad を十分に理解することができませんでした。どちらかを使用して同等のメソッドを作成します。しかし、私が成功したとしても、State Monad の実装は醜い " get
" と " put
" (および " runState
" など) を使用しているように見え、コードが読みにくくなるだけでなく、読みにくくなるでしょう。
このすべての後、私は何か間違ったことをしている、何かを誤解している、または単にやりたいことができないという結論に達しました. 「まあ、コードを変更して状態を自動的に処理するように変更する必要はありません。問題なく動作するので」とあきらめようとしていました。ここで聞いてください(私のデビューデラーキング)。私はよりエレガントなソリューションを好むでしょう。
私はまた、よりエレガントなソリューションが、私が「無料で」使用するこの機能を提供してくれると考えています。
考え、提案、参照、そしてあなたの時間をありがとう!
haskell - レコード構文を使わずに MonadState クラスを実装する方法は?
MonadStateを理解するのは難しいと思います。
その理由は、ほとんどの例がデータ構造のレコード構文と混同している可能性があります。
そこで、レコード構文を使わずにMonadStateを実装してみました。
私が書いた次のコードはコンパイラを通過しましたが、私にはまったくナンセンスに思えます。
これらのコードの何が問題になっていますか?
レコード構文を使用せずにMonadStateを実装する簡単な例はありますか?
haskell - リストの構築中に値を累積するための再帰状態モナド?
私は Haskell をまったく初めて使用するので、質問がばかげている場合は申し訳ありません。
私がやりたいことは、リストを再帰的に構築すると同時に、再帰呼び出しに基づいて累積値を構築することです。これは私が Coursera コースで行っている問題のためのものなので、正確な問題は投稿しませんが、類似したものを投稿します。
たとえば、int のリストを取得し、それぞれを 2 倍にしたいとします (単に使用できる例の目的のために無視しますmap
) が、リストに数字 '5' が表示される回数もカウントしたいと考えています。
したがって、倍増を行うには、次のようにします。
ここまでは簡単。しかし、どうすれば 5 の回数を数えることができるx
でしょうか? 私が得た最善の解決策は、このような明示的なアキュムレータを使用することです。これは、リストを逆にするので好きではないので、最後に逆にする必要があります。
しかし、これは以前に使用したことのないモナドでより適切に処理できるはずですがState
、見たパターンに適合する関数を構築しようとすると、への再帰呼び出しのために行き詰まりますfoo
. これを行うより良い方法はありますか?
編集:これは非常に長いリストで機能する必要があるため、再帰呼び出しも末尾再帰にする必要があります。(私がここに持っている例は、Haskell の 'tail recursion modulo cons' のおかげで、なんとか末尾再帰になっています)。
haskell - Lens の欠落している State Combinator を検索しています
現在、次のようなコードがあります。
foo
aLens
はFoo
フィールドに、runFoo :: MonadState m => Foo -> m Foo
この操作を1行で行う方法があるはずだと思いますが、見つかりません。次のようなコメントが必要だと思います。
質問:
- そのようなコンビネータは存在しますか?もしそうなら、それは何ですか?
- このような別の質問に出くわしたとき、それを検索する最善の方法は何ですか (つまり、通常はこれを Hoogle に入力するだけですが、レンズ ライブラリでそれを行うのはうまくいきませんでした)。
- これは実際には Control.Monad にあるプリミティブ コンビネータですか? (これがクライスリの矢のまた別の仕事だったらちょっと恥ずかしい)
f# - F# で異なるワークフローを同時に使用できますか?
多分ワークフローで関数をチェーンできるようにしながら、状態を渡す必要があります。2 つのワークフローが同じコンテキストを共有する方法はありますか? いいえの場合、それを行う方法は何ですか?
アップデート:
さて、データベースで作成しようとしているエンティティの利用可能な ID のセグメントを表す状態があります。そのため、ID を取得したら、その状態を次に使用可能な ID を使用して新しい状態に変換し、誰もそれを再び使用できないように破棄する必要があります。慣用的になるために状態を変更したくありません。State モナドは、変換を隠して状態を渡すため、進むべき道のように見えます。状態ワークフローが整ったら、どこでも使用する Maybe ワークフローを使用できません。
haskell - 状態モナドと gtk2hs
ユーザー入力から値のリストを作成できるように、GUI アプリケーションの状態を保持しようとしています。しかし、私は State モナドを理解するのに苦労しているので...
ここに私が望むものを説明するためのいくつかのテストコードがあります(コンパイルしようとさえしていないことは明らかです):
とにかく、State の代わりに StateT を使用する必要があると思いますが、頭の中が完全に混乱しています (非常に多くのチュートリアルを読んでいます...)。動いたとしても、ループごとに初期状態を [] にしているからダメ。問題は、更新ボタンが押されるたびにユーザー入力が何らかの状態 (以前の入力のリスト) に追加されるように、関数 addToList をどのように記述すればよいかということです。