問題タブ [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.

0 投票する
0 に答える
1018 参照

design-patterns - 状態モナドと戦略パターン

ライブラリを再設計していますが、現在の設計パターンに満足していません。この質問は、 State モナドと組み合わせた戦略パターンの使用に関するものです。

私は持っていFilterます。基本的な実装では、あるタイプのデータフィードを受け取り、'd自分自身を更新して、自分自身の新しい更新されたコピーを生成するだけです。

次に、ISignalGeneratorフィルター、環境データを取得し、それを処理してSignalタイプのを生成し'Sます。

SignalGenerator戦略パターン オブジェクトです。の実装SignalGeneratorでは、ライブラリ ユーザーは、Signal.

コードをステート モナドでラップできます。いくつかの環境変数 (データフィード) とともに、状態モナドは状態として 'Filter' を運びます。SignalGenerator次に、状態モナド ( type のデータフィードと ) を介して状態の更新を取得し'dますFilter

私が抱えている設計上の問題は、型をワークフローの開発から切り離したいということですSignalGenerator。つまり、状態モナドを の腹に入れ子にするのを避けたいのSignalGeneratorです。これを達成するための機能的な設計パターンはありますか?

編集

トーマスさんのコメントをもとに、おもちゃの模型を作ってみました。戦略クラスを持つという選択は、多数の関数をまとめる必要性に基づいています。

Strategy腹に状態モナドを入れ子にすることなく、クラスがマウントされた関数を消費できるパターンソリューションがあるかどうか疑問に思っていました。言い換えれば、let state = StateMonadBuilder<int> ()型推論の頭痛の種に陥ることなく、 の定義を延期する方法はありますか?

私は関数型プログラミングと F# に比較的慣れていません。私の質問が理にかなっているかどうか教えてください! ありがとう。

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

monads - 使用の正当性 >>

実世界の Haskellの章(>>)では、次のような正当化を行います。

特定の順序でアクションを実行したいが、1 つの結果がどうなるかは気にしない場合に、この関数を使用します。

次に、それを示す良い例を示します。

この章の後半では、State モナドでランダムな値を生成するために同じ概念を使用しています。

put gen' >>しかし、この場合、最終的に出力値を無視しているのに、なぜステートメントを使用しているのでしょうか。上記の関数を次のようにできないのはなぜですか。

この質問を完了するために、上記のコンテキストに関連する型定義と関数を追加します。

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

oop - Haskell - 状態モナドは命令的思考の兆候ですか?

私は簡単なゲーム - テトリスを書いています。私の人生で初めて、その目標のために関数型プログラミングを使用しています。言語として Haskell を選びました。しかし、私は OOP と命令型思考に染まっており、無意識のうちにこの考え方を Haskell プログラムに適用することを恐れています。

ゲームのどこかで、経過時間 (タイマー) と押し下げキー (キーボード) に関する情報が必要です。Haskell に変換された SDL レッスンで使用されるアプローチは次のようになります。

Main.hs

タイマー.hs

そして、そのように使用されます: modifyFPSM $ liftIO . start. これにより、Timer はいくらか純粋になります (明示的にはモナドではなく、時間を測定するために必要なため、その関数は IO のみを返します)。ただし、Timer モジュールの外側のコードに getter と setter が散らばっています。

Keyboard.hs で使用される私のアプローチは次のとおりです。

これにより、モジュールは自己完結型になりますが、これが Haskell で OOP からオブジェクトを表現する私の方法であり、FP の要点全体を台無しにしてしまうのではないかと心配しています。だから私の質問は:

それを行う適切な方法は何ですか?または、そのような状況にアプローチする他の可能性は何ですか? また、他の欠陥 (デザインやスタイルの問題など) に気付いた場合は、遠慮なく指摘してください。

0 投票する
0 に答える
419 参照

haskell - mtl が build-depends にあるにもかかわらず、cabal ビルドに Control.Monad.State がありません

モジュールの 1 つが Control.Monad.State を使用している独自の cabal パッケージをビルドしようとしていますが、次のエラーが発生します。

build-depends に mtl を追加しましたが、成功しませんでした。プロファイリング用にビルドするときに他の人が問題を抱えていることを読みましたが、mtl はそのためにビルドされていませんでしたが、プロファイリング用にビルドするべきではありません。~/.cabal/config で、library-profiling と executable-profiling の両方を明示的に False に設定しています。

私はMac OSを使用しています

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

arrays - St モナドと State モナド (または同等のもの) をどのように組み合わせる必要がありますか?

私は理解を得るためにコードを作成しています。実際には、ソリティア ソルバーです。私は State モナドを使用する単純な力ずくの実装を持っています。実際には、それを使用できることを証明するためです (評価された各移動のカウントを保持するだけです)。しかし今、Unboxed Mutable 配列を使用して訪問したボードを記録し、別のパスを介して既に訪問したボードの位置に到達したときにパスの評価を短縮したいと考えています。ST モナドでは暗黙の状態をスレッド化できないようですが、Mutable 配列にアクセスするには ST (または IO) を使用する必要があります。だから私は2つのモナドを組み合わせる必要があるようです - 状態をスレッド化する状態(実際にはミュータブル配列を含みます)とミュータブル配列関数を得る別のモナド(ST)。

  • これは正しいですか?
  • もしそうなら、(標準的な?) Data.Array.ST/Control.Monad.ST/Control.Monad.ST と mtl の組み合わせよりも優れた代替手段はありますか?
  • もし私がこの方法をとった場合、ST と State をどの順序でスタックするかは重要ですか?
  • モナドトランスフォーマーの使用を避けるために、ST または State のいずれかまたは両方に基づいて独自の単一のモナドをローリングすることを検討する必要がありますか?
0 投票する
1 に答える
195 参照

haskell - Haskellで同じStateモナドの状態を無期限にスレッド化する方法は?

Haskell から始まり、State Monad で立ち往生...

そこで、私は Haskell の State Monad を理解しようとしています。それを理解するために、PRBS シーケンスを生成するコードを書いています。興味のある方は、論文「Pseudo Random Sequences and Arrays」で説明されています。この論文の無料コピーは doi: 10.1109/PROC.1976.10411 から入手できます。

本質的な計算は非常に単純です。シフト レジスタ生成多項式があります。生成多項式は、シフト レジスタのどのビットを取得して合計し (モジュロ 2)、シフト レジスタの MSB を取得するかを示します。次の反復では、この計算された MSB を取得し、右シフト操作を行ったにシフト レジスタの MSB に貼り付けます。

モナドなしでこれを行うためのコードは非常に単純です:

出力は次のとおりです。

それが私が欲しいものです。

もちろん、シフトレジスタは変更する状態と見なすことができるので、この目的のために状態モナドを使用できます。状態モナドについて学ぶには単純すぎる問題かもしれませんが、これは状態モナドを使って実装できる完璧な例かもしれないと思います。だからここに私がしたことがあります:

import Control.Monad.Stateこれは、プログラムの最初の likeとともに、コードの前のコード セグメントに追加するだけです。これを GHCI にインポートして状態計算を確認すると、以下に示すように個々の値を取得できます。

したがって、状態が正しく更新され、返される値も正しいです。ここで、配列を作成できるように、 s時間に演算子wordを適用する前の実装の関数のような関数を作成したいと思います。私はこれを行う方法についてもまったく無知です。次のような一連の関数を入れたくないことに注意してください。>>bitMnword p s

渡す関数が 1 つn必要であり、bitM評価を連続して実行しn、連続する計算で内部的に状態を自動的に渡し、結果の値を収集し、結果として配列を作成します。どうすればそれを行うことができますか?これを行う方法がわかりません。どんな助けでも大歓迎です!