問題タブ [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で非決定論的な状態モナドを構築するにはどうすればよいですか?
Haskellで非決定論的な状態モナドを構築したいと思います。これにより、ビルドアップ状態を使用して検索スペース内のすべての要素を生成し、不良な場所を取り除くことができます。次の(擬似)コードがあるとします。
ここで機能しないことがいくつかあります。私が理解する必要がある最も基本的なことは、何かを述べてから、それを各expand
ブランチにパイプする方法です。型の関数を使ってさまざまな方法を試しましたState Int [ State Int Element]
が、最終的には、リストモナドのブランチを状態ラッパーでラップすると、削除できなくなります。それで、これを行う方法はありますか?
ありがとう。
scala - 状態モナドでトラバースするときの入れ子構造の扱い方
私は、scalaz 状態モナドを使用して XML に変換しているネストされた構造を持っています。これは、複数レベルのネストされた構造を処理する必要があるまではうまく機能します。これは、私がやっていることと同様の単純化された例です。次の ADT があるとします。
state モナドを使ってコンバーターオブジェクトを書きます (Scalaz7 と以下のインポートを仮定しますimport scalaz.{Node => _, _}; import Scalaz._; import scala.xml._
):
スタック設定によってconvert(nested(1000)).apply(Parents(0, 0))
は、変換プロセスでスタック オーバーフローが発生します。(値を大きくするとnested
オーバーフローが発生しますが、この質問のために作成したばかりなので無視できますnested
。):
私の質問は - でのスタック オーバーフローを回避する最善の方法は何scalaz.stateT
ですか? XML シリアライゼーション ロジックの追跡とトラブルシューティングが容易になる場合は、実際の例のように状態モナドを使用し続けたいと思います (実際の入力構造は、ライブ デバッグ セッションから取得されたJDI ミラーオブジェクトと配列であり、内部値はネストされたフィールド値です)。 .
編集:ネストされたスタックの問題を取り除くには:
haskell - STArrayをHaskellのリストに変換するには?
関数が行うことを実行できる関数はありますかarrayToList
:
そうでない場合、どのように書くのですか?
haskell - Control.Monad.State API は最近変更されましたか?
学習課題として、Haskell でヒープソートを実装しようとしています。State
ヒープは単一の構造内でデータを移動することにかなり大きく依存しているため、これを行うにはモナドが正しい選択であると考えました(そしてdo
表記法が役立つでしょう)。また、モナド全般についての理解を深めたいと思っています。
Learn You A Haskell (および他の多くのチュートリアル)のモナドの例では、State
次のように定義されています。 State
s -> (a,s)
型の関数(他の引数でカリー化される場合とされない場合があります) をState
値コンストラクターに渡す必要があります。したがって、私の関数は次のようになります。
これはコンパイルされず、次のエラーが発生します。
のAPI ドキュメントを読むと、これらのチュートリアルが作成されて以来、モジュールから値コンストラクターが削除されているControl.Monad.State
ように見えます。State
初心者として、私はドキュメンテーションが一目瞭然ではないことに気づきました。だから私の質問は:
State
値コンストラクターがなくなったと信じるのは正しいですか?- 代わりに何を使用すればよいですか?
haskell - 状態モナドで立ち往生
ノードと一意のキーの IntMap を使用してグラフ構造を作成したいと考えています。このトピックはこことここでよく取り上げられています. 基本的に state -> (val,state) の関数を newtype でラップすることで状態モナドがどのように機能するかを理解しているので、そのモナドインスタンスを作成できます。私はそのトピックについてかなり読んだことがあります。プログラムの実行中に一意の(または単なる増分)値を取得する方法について、まだ頭を悩ませているようです。連続した ID の実行を取得するのは簡単ですが、モナドから抜け出すために "runState" を実行すると、現在の ID を追跡しなければならなかった場所に戻ったように思えます。モナドに閉じ込められたような気がします。私が検討したもう 1 つのオプションは、IntMap 全体と現在の「次の」ID を状態として保持することでしたが、それは非常に「必須」で極端に思えます。これ質問は非常に似ていますが、多くの回答が得られませんでした(または、明らかな何かが欠けているだけかもしれません)。プログラムの実行中に状態モナドを利用して一意の ID を取得する慣用的な方法は何ですか? ありがとう。
haskell - 状態モナドの bind がどのように実装されているか (とりわけ) 誰かが説明してもらえますか?
LYAH や Haskell Wiki などの非常に明確な説明を読んだにもかかわらず、状態モナドがどのように実装されているかについてまだ混乱しています。自信がありませんが、それが何であるかを理解していると思います。
それでは、簡単なデータ型があるとしましょう:
この:
次に、SimpleState をモナドにします
質問 1: ラムダは s (状態) をパラメーターとしてどのように取り込んでいますか? どのように渡されますか?
質問 2:applySimple
が関数シグネチャに 1 つのパラメーターを取り込んでいる場合、なぜapplySimple st s
ラムダ内にあるのですか? なぜapplySimple
2回適用されるのですか?
さらに紛らわしいことに、これは状態を変更します。
質問 3. これは何ですか? SimpleState に対して何らかのアクションを実行しているのに、その署名が関数ではないのはなぜですか?
これで、tic をこの関数に渡すことができます。
質問 4: tic を と一緒に使用できますか / どのように使用し>>=
ますか?
そして、次のように使用します。
私はこれを得る:
繰り返しますが、applySimple
私を混乱させる2つのパラメーターに適用されます。
要約すると、コンストラクターが s をパラメーターとして取り込む関数を取り込んでいるという事実に本当に夢中になっており、SimpleState
それがコンテキストでどのように使用されているのかがわかりません。
haskell - Haskell: 単純な State モナドの get と put を desugar しようとしています
State モナドの詳細を調べるために、単純な状態モナド関数の完全な desugar バージョンを自分で作成して、Haskell で「get」は実際に初期状態を /get/ する方法は?で始まった考えを完成させようとしています。、J Cooperによる回答。
状態モナド関数の例では、(概念的に) 入力が (v, s) の場合、出力は (s, v) になるように、状態と入力値を単純に交換します。3 つの変換を示します。最初は do 表記から desugared >>= および >> へ、次にこれらの演算子を関数の位置に配置し、最後にそれらを置き換えて get/put をそれらの定義で試みます。
「do」バージョンと最初の 2 つの翻訳は機能しますが、最終的な翻訳は機能しません。問題:
- モジュールをロードすると、GHCi は z1 がスコープ外であることを報告します。
- >> 翻訳で渡される引数の省略を表す方法を正確に理解していません。
これらはどのように修正する必要がありますか?
FWIW、現在の Haskell プラットフォーム (GHC 7.4.2)。
ありがとう!
haskell - この場合、ネストされたStateT monadTと対話するときに、「lift」を使用する必要がないのはなぜですか?
私がmonadTを持っているとしましょう:
ここで注意すべき重要なことは、1つのStateTが別のStateTをラップしており、両方が3番目のMonadT、つまりReaderT内にラップされていることです。
便宜上、対応するrunWrap関数:
そして、一般的なトック状態モナド:
ここで、内部でtockを使用するラップmonadTを作成します。
そしてそれを実行します:
ここでの使用はlift
、MonadTのネストされたレイヤーと相互作用する方法を理解しているという点で私には理にかなっています。
ただし、これも機能し、同じ答えが得られます(201,2)
::
tock
w / olift
と呼ぶとtock
、外側のMonadT、つまりReaderTに適用されているように見えますが、これは意味がありません。しかし、なぜこれが機能するのでしょうか?
PSEnv
ここの存在を無視してください、それは質問とは何の関係もありません、ただ私が使用している外側のMonadTの選択だけです。
haskell - モデルと GUI IO (Wx) の分離状態: スタックか FRP か?
私の作図ツールでは、コア モデルのコードを GUI から切り離したいと考えています。
次の例では、「状態」は で渡されvDiag
ますTvar
。これは wx の設計上の決定です。ここで、私の作図ツールでは、コア モデルをfgl
グラフに "格納" し (複雑な型を含む)、wx
ビューのみを与えたいと考えています。この例では、ペイント時の読み取りアクセス用のポイントのリストと、クリック、ドラッグなどの際に書き込むいくつかの関数を言います.. 最初に Monad スタックをいくつか考えましたが、StateT と wx の IO を組み合わせることさえ簡単ではないように見えます。これは、io アクションがコールバックのコード全体に広がっているためです (クリック時、ペイント時など)。スタックの一番下に IO を配置するのがうまくいかなくなったように感じます。
それで、どのようにSTateを渡すのですか、それとも行く方法ではありませんか?(私は直感的にこれは古典的です。RFP はどのように始まったのでしょうか?)
(クリックすると赤い円を描くコードでは、ポイントのリストが で渡されTvar
vDiag
ます。同等の状態アクセサーが移動する場所に「--fgl」をタグ付けし、基本的な fgl テスト グラフ アクセサーを設定します。 State に入れたいと思います) (元々、問題を理解するために FRP なしで試してみました - 反応性バナナですが、既にヒットしている可能性があります ;-)
arrays - STUArray を使った関数の適切な署名が見つからない (どちらも GHC も見つからない)
ST-Monad とボックス化されていない STArray (STUArray) を使用して、行列の行列式を見つける関数を作成しました。マトリックスの型は次のとおりです。
つまり、要素を含む不変のボックス化されていない配列を含む不変の配列です。IArray UArray e
これには、を扱う関数に Predicate を追加する必要がありMatrix
、これにはFlexibleContexts
. わかりました。
行列式の計算に使用される関数には、次のシグネチャがあります。
MArray (STUArray s) e (ST s)
内部で配列が可変配列 (外側はボックス化され、内側はボックス化されていない) に変換されるため、Predicate も追加する必要があります。
この関数は次のように使用できます。
正常に動作します。しかし、それがどれほど醜いか見てください!もちろん、of の内部構造を公開したくはありませんMatrix
(少なくとも、関数に付加された述語が既に私に与えている以上のことはしません)。次の関数を定義したいと思います。
そして、私はできません。
適切な署名なしで試しました:
失敗します。結構です、私は頭を働かせます:がdetST
必要です。IArray UArray e, MArray (STUArray s) e (ST s), Num e, Eq e, Division e
det
失敗します。しかし、方法がわかりません。GHC ( 7.4.2 ) が私に与えるメッセージは次のとおりです。
しかし、その正確な用語は述語にあります!
GHC は次のことを提案します。
わかった。私の理解では、私はそれを最初に行いました。また、そのためのインスタンスが存在します(MArray ...)
(そうでなければ、どうすればそれをメインでうまく使用できたでしょうか?!)。
ここで何が悪いのかわかりません。の「隠された」ST状態と関係s
があり、 のはindetST
以外s
のものであると思いますが、これの型を書く方法がわかりません。s
det
の適切な定義は何ですかdet
- そしてその理由は?!
なしのプログラムは、det
のみを使用して正常にコンパイルされFlexibleContexts
、警告はありません-Wall
。完全なソース コードは、ここで要旨として見つけることができます。