問題タブ [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 - モナドを使用したよりエレガントなコードのヒント?
私はついにモナドの使い方を理解しました(私がそれらを理解しているかどうかはわかりません...)が、私のコードは決して非常にエレガントではありません。Control.Monad
これらすべての機能が実際にどのように役立つかについての理解が不足しているためだと思います。したがって、状態モナドを使用して、特定のコードでこれに関するヒントを求めるのがよいと思いました。
このコードの目的は、さまざまな種類のランダムウォークを計算することです。これは、より複雑なものの前に私がやろうとしていることです。問題は、同時に2つのステートフル計算があり、それらを優雅に構成する方法を知りたいということです。
- 乱数発生器を更新する関数は、ある種のものです。
Seed -> (DeltaPosition, Seed)
- ランダムウォーカーの位置を更新する関数は、ある種のタイプです
DeltaPosition -> Position -> (Log, Position)
(Log
ランダムウォーカーの現在の位置を報告するための何らかの方法があります)。
私がやったことはこれです:
この2つのステートフル計算を構成する関数があります。
次に、それを状態を構成する関数に変換します。
そして、私は最も単純なものを持っています。たとえば、現在の位置に乱数を合計するだけのランダムウォーカーです。
そしてこれを繰り返し行う関数:
そして、これをロードしghci
て実行すると、次のようになります。
ランダムウォーカーが占める位置のリストである、私が欲しいものを手に入れます。しかし...これを行うにはもっとエレガントな方法があるに違いないと思います。2つの質問があります:
の巧妙な関数を使用して、これらの関数をより「モナディック」な方法で書き直すことはできます
Control.Monad
か?このような状態の組み合わせで使用できる一般的なパターンはありますか?これはモナド変換子などと関係がありますか?
haskell - 州のモナド:あるパターンを別のパターンと交換しますか?
だから私はHaskellでゲームを書いていて、プレイヤーのターンをさまざまなターンフェーズに相関する一連の状態変更関数として表現しています。元々、これは次のようになります。
州の君主制の第一候補ですよね?これにより、よりエレガントになります。
ただし、ボイラープレートの「状態取得」ステップから始めるには、、phase1
などを変更する必要があるようです。phase2
これを抽象化する方法があることを望んでいるので、発信者と着信者の両方で定型文を避けることができます。私はこの方法が何であるかを知るにはあまりにも新しいです(これは私の最初の本当のHaskellプロジェクトです)。何かアドバイス?
haskell - エラー処理も行う状態モナドを書くにはどうすればよいですか?
エラー処理もサポートできる状態モナドを書く必要があります。エラーの原因についての詳細も提供できるため、この目的のために、Either モナドを使用することを考えていました。Maybe モナドを使用して状態モナドの定義を見つけましたが、Maybe の代わりに Each を使用するように変更することはできません。コードは次のとおりです。
haskell - StateTとStateモナドの組み合わせ
私が機能を持っているとしましょう
および関数:
f
で使用してg
、それらの間の状態を渡したいです。のライブラリ関数はあり
StateT (return . runState f)
ますか?または、一般的に、対応するモナドを持つモナド変換子が与えられた場合、そのためのライブラリ関数はありますか?
data-structures - Haskell で大きな状態を高速に更新する
私の Haskell のベクター グラフィックス ライブラリでは、かなり大きな状態 (ライン ストロークのパラメーター、色、クリップ パスなど) を持ち歩かなければなりません。これを行う方法は 2 つあります。Haskell-cafeからのコメントを引用すると、「可変状態のリーダー モナドか、不変状態の状態モナドを使用することをお勧めします」。
これが私の問題です。大きな不変状態を更新すると、パフォーマンスが低下します。多くの STRef を使用することは、Haskell で C を書くようなものです。冗長で醜いです。
不変の状態は次のとおりです。
私が知る限り、「state { lineWidth = x }」は新しい GfxState を作成し、古いものをガベージ コレクションできるようにします。状態が大きく、頻繁に更新される場合、これはパフォーマンスを低下させます。
変更可能な状態は次のとおりです。
(GfxState s) と (ST s) と (STRef s) がいたるところに表示されるようになりました。これは、冗長で紛らわしく、短くて表現力豊かなコードを書く精神に勝っています。C + FFI を使用して大きな状態を読み取って更新することもできますが、このパターンに頻繁に遭遇するので、もっと良い方法があることを願っています。
haskell - 特定の状態データ型の多相 MonadState 関数をエクスポートする
私がやろうとしているのは、(私が書いているモジュールで) 状態モナドの特定の型で動作する関数をエクスポートすることです (以下の例では、その型は になりますFoo
)。ただし、ユーザーが希望するタイプの関数を使用できるようにしたいと考えていますMonadState
: State.Lazy
、State.Strict
、StateT
など。
これが私がやりたいことの例です:
より良い質問で編集:
上記の型を定義するには FlexibleInstances 拡張が必要であると GHC は訴えています。その拡張機能を使用して関数を定義する正しい方法ですか、それともより良い方法がありますか?
ありがとう
scala - 基本的な Scalaz 状態の質問
State
の動作を模倣するにはどうすればよいList.zipWithIndex
ですか? 私がこれまでに思いついたこと(うまくいきません)は次のとおりです。
これは、状態の例に非常に大まかに基づいています。私が言ったように、それはうまくいきません:
case ステートメントの行を変更することで機能させることができます。
しかし、これは間違っているように感じます。誰でも助けることができますか?
編集-もっと遊んで、これにたどり着きました
改善できますか?以外のコンテナに一般化できますかList
(もしそうなら、どの型クラスが必要ですか?)
EDIT 2 -少し不格好ではありますが、一般化しました
または非常に似ています:
variables - State、ST、IORef、MVarの違い
私は48 時間以内に自分でスキームを書く(私は約 85 時間までです) に取り組んでおり、変数と代入の追加に関する部分に到達しました。この章には大きな概念上のジャンプがあります。最終的な解決策に直接ジャンプするのではなく、その間に適切なリファクタリングを行って 2 つのステップで実行されていればよかったのにと思います。とにかく…</p>
同じ目的を果たしているように見える多くの異なるクラスで迷子になりました: State
、ST
、IORef
、およびMVar
. 最初の 3 つはテキストで言及されていますが、最後の 3 つは、最初の 3 つに関する多くの StackOverflow の質問に対する好まれる回答のようです。それらはすべて、連続する呼び出しの間に状態を保持しているようです。
これらはそれぞれどのようなもので、どのように互いに異なるのでしょうか?
特に、次の文は意味がありません。
代わりに、状態スレッドと呼ばれる機能を使用して、Haskell に集約状態を管理させます。これにより、変数を取得または設定する関数を使用して、他のプログラミング言語と同じように変更可能な変数を扱うことができます。
と
IORef モジュールを使用すると、IO モナド内でステートフル変数を使用できます。
これらすべてが行をtype ENV = IORef [(String, IORef LispVal)]
混乱させます-なぜ2番目なのIORef
ですか? type ENV = State [(String, LispVal)]
代わりに書くと何が壊れますか?
polymorphism - OCaml の状態モナド
OCaml で状態モナドを実装しようとしていました (演習として)。私の実装は次のようになります。
ファンクタを使用して状態型をモジュールにラップするという考えが気に入らないので、レコード フィールドに存在型を選択しました。上記の実装は機能しますが、実装中に問題が発生しましgetState
たsetState
。私はそれらを次のように実装しようとしました:
'a -> ('a * 'a)
と などの推論されたフィールド型'a -> (unit * 'a)
は、宣言された型より一般的ではないため、これは機能しません's . 's -> ('a * 's)
。なぜこれが起こっているのか理解していますが、レコードアプローチを使用してそれを機能させる別の方法があるかどうか疑問に思っていましたか?
ありがとう。
乾杯、アレックス
haskell - このMonad Stack関数の名前は?
State モナド内にステートフルな関数がたくさんあります。プログラムのある時点で、いくつかの IO アクションが必要になるため、次のようなタイプのペアを取得する StateT 内に IO をラップしました。
物事を単純にするために、IO コンテキストを関数のメイン セットに渡したくありません。また、それらをモナド スタック型でラップすることは避けたいと思います。しかし、トップレベル関数からそれらを呼び出すには、リフトに似たものが必要ですが、内側のモナドから値を持ち上げようとしているわけではありません。むしろ、私は StateT モナドの状態を State モナドの同等のものに変換したいと考えています。これを行うために、私は次のものを持っています:
これは、次のようなものをインターリーブするために使用されます。
かなり明白なコード ブロックのように思えるので、この関数には標準名があり、標準ライブラリのどこかに既に実装されているのだろうか? 説明を簡潔にしようとしましたが、明らかにこれは、スタックから 1 つのトランスフォーマーを取り出し、ラップされた値をトランスフォーマー型のいとこに変換し、スタック内で下のモナドをスキップし、結果を終わり。