問題タブ [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 で書かれています) について学ぶために、空き時間にWhitespaceに高水準言語とコンパイラを設計しています。
コンパイラのコード生成フェーズでは、構文ツリーをたどる際に「状態」のようなデータを維持する必要があります。たとえば、フロー制御ステートメントをコンパイルするとき、ジャンプ先のラベルに一意の名前を生成する必要があります (ラベルは、渡され、更新され、返されたカウンターから生成され、カウンターの古い値を二度と使用してはなりません)。もう 1 つの例は、構文ツリーでインライン文字列リテラルに遭遇した場合です。それらはヒープ変数に永続的に変換する必要があります (ホワイトスペースでは、文字列はヒープに格納するのが最適です)。現在、これを処理するためにコード生成モジュール全体を状態モナドにラップしています。
コンパイラを書くことは関数型パラダイムに適した問題だと言われたことがありますが、私はこれを C で設計するのとほぼ同じ方法で設計していることに気付きました (C は実際にはどの言語でも書くことができます。 Haskell と状態モナド)。
Haskell 構文を使用した C ではなく、Haskell で (むしろ関数型パラダイムで) 考える方法を学びたいです。状態モナドの使用を本当に排除/最小化しようとするべきですか、それとも正当な機能的な「設計パターン」ですか?
haskell - Haskellの初期状態を実際に「取得」するにはどうすればよいですか?
私は機能を持っています:
私はこの関数全体で何が起こっているのかをほとんど理解でき、モナドのコツをつかみ始めています。私が理解していないのは、これを実行するときの方法です:
「test」の「get」関数は、どういうわけか初期状態「testtest」を取得します。誰かがこれを分解して説明してもらえますか?
返信ありがとうございます!
haskell - Haskellで隠された方法で状態を初期化するにはどうすればよいですか(PRNGのように)?
私は State モナドに関するいくつかのチュートリアルを経て、アイデアを得たと思います。
たとえば、この素敵なチュートリアルのように:
OK、getRandom を使用できます。
しかし、PRNG を呼び出すたびにシードを PRNG に渡す必要があります。Haskell 実装で利用可能な PRNG はそれを必要としないことを私は知っています:
ほとんどのチュートリアルで見られるのは「永続的な」状態ではなく、状態をスレッド化するための便利な方法であるように見えるため、おそらく State モナドを誤解していました。
それで... Random モジュールのように、自動的に初期化される状態 (時間やその他のあまり予測できないデータを使用する関数から可能) を取得するにはどうすればよいでしょうか?
どうもありがとう!
haskell - State モナドを使うのと、状態を再帰的に渡すのとではどちらが良いですか?
私は Haskell を学んでいて、視線アルゴリズムを実装する最も慣用的な方法を見つけようとしています。
私が見つけたデモ コードは状態モナドを使用していますが、状態を再帰的に渡す方が簡単なように思えます (私は単なる初心者です)。ここで何が欠けていますか?パフォーマンスの問題はありますか?
コードの検索: http://www.finalcog.com/bresenham-algorithm-idiomatic-haskell
ありがとう、
クリス。
haskell - 状態モナド、乱数列とモナドコード
私は状態モナドを把握しようとしています。この目的のために、線形合同ジェネレーターを使用して一連の乱数を生成するモナド コードを書きたかったのです (おそらく良くありませんが、私の意図は状態モナドを学習することであり、良い RNG ライブラリを構築します)。
Bool
ジェネレーターはこれだけです (簡単にするために s のシーケンスを生成したい):
数値について心配する必要はありません。これは、(Numerical Recipes によると) Int
s の疑似ランダム シーケンスを生成するシードの単なる更新規則です。今、乱数を順番に生成したい場合は、次のようにします。
わかりましたので、State Monad を使用することで、このボイラープレートを回避できます。
そして最後に:
Bool
OK、これは問題なく動作し、与えられたシードごとに n 個の疑似乱数のリストが表示されます。しかし...
私は自分がしたことを読んで(主にこの例に基づいています:http://www.haskell.org/pipermail/beginners/2008-September/000275.html)、それを複製して他のことをすることができます。しかし、do 記法とモナド関数 (replicateM など) の背後で実際に何が起こっているのか理解できないと思います。
誰かがこの疑問について私を助けることができますか?
1 - nextVal 関数の機能を理解するために desugar しようとしましたが、できませんでした。現在の状態を抽出して更新し、その状態を次の計算に渡すと推測できますが、これは、この do-sugar を英語であるかのように読み取ることに基づいているだけです。
この関数を元の >>= に実際に脱糖し、関数を段階的に返すにはどうすればよいですか?
put
2 - 関数と関数が正確に何をするのか理解できませんでしたget
。状態を「パック」および「アンパック」していると推測できます。しかし、ドーシュガーの背後にあるメカニズムは、まだ私にはとらえどころのないものです.
さて、このコードに関するその他の一般的な意見は大歓迎です。Haskell を使うと、動作するコードを作成して期待通りの動作をすることができると思うことがありますが、命令型プログラムで慣れているため、「評価に従う」ことはできません。
haskell - Haskellモナド変換子のスタックと型の署名
モナド変換子のスタックを作成しようとしていますが、関数の正しい型シグネチャを取得できません。(私はまだHaskellにかなり慣れていません)
スタックには、追跡する必要のある複数の状態(2つは倍増する可能性がありますが、すぐにわかります)とロギング用のWriterTがあるため、複数のStateTトランスフォーマーが組み合わされています。
これが私がこれまでに持っているものです:
状態や機能をpopLine
いじって状態に影響を与えてほしい。に渡される計算です。[Line]
xLineNum
Int
evalr
runPass1
コードをロードするたびに、一般的に次のようなエラーが発生します。
どの署名も正しくないようですが、popLineは最初の関数であるため、すぐにエラーが発生するのはpopLineだけです。
私はそれが型署名に示唆するものを追加しようとします(例えば:popLine :: (MonadState [Line] m) => ...
しかしそれからそれは次のようにエラーになります:
型変数ではないことをしようとすると、常にこのメッセージが表示されるようです。(MonadState s m)
他の何かでOKとエラーが好きなようですが、[a]
代わりにs
それを試してみると、上記のようなエラーが発生します。(最初は[Line]とIntが単一の状態でタプリングされていましたが、このエラーが発生していたので、別々の状態にしようと思いました)。
GHC 6.10.4、Kubuntu
だから、誰かが私に何が起こっているのかを教えて説明を与える/正しい型の署名を見せてくれるか、または誰かがこのようなものに関する良いリファレンスを知っていますか(これまでに役立ったのは「モナド変換子のステップバイステップ」だけでした) 、しかしそれはただ1つのaux状態関数と1つのStateTを使用しますか?
よろしくお願いします。
編集
これは、JFTとEdwardの提案を組み込んだコンパイルコードです。
私は結合incLineNum
し、ライターモナド部分を機能popLine
さnextLine
せる必要がありますが、ここからどこに行くべきかはわかっていると思います。みんなありがとう。
haskell - StateTとWXGUIの共存
通常のwxHaskellプログラムは次のようになります
guiはタイプを持っている必要がありIO a
、runはタイプを持っている必要があります。IO a -> IO ()
また、にはいくつかの初期化ルーチンがありますrun
。
私は次のことをやろうとしています:
ただし、この場合、GUIのタイプは。でなければなりませんgui :: MApp AppGlobals
。このタイプのため、通常のIOモナド構文を使用できなくなります。つまり、liftIO
IOアクションを実行するたびに使用する必要があります。
wxHaskellでStateモナドを使用する便利な可能性はありますか?状態を各イベントハンドラーに手動で渡すのはあまり便利ではありません。
haskell - 継続モナド「インターフェース」
状態モナド「インターフェース」
(+ return と bind) により、コンストラクターを使用せずに State モナドを使用して可能な計算を構築できますState
。たとえば、次のState $ \s -> (s+1, s-1)
ように記述できます。
同様に、とを使用Reader
してその計算を作成できるため、コンストラクターを使用する必要はありません。正確には: .ask
return
(>>=)
Reader f == ask >>= return . f
継続についても同じことが当てはまりますか - Cont r a
usingのすべてのインスタンスcallCC
( の唯一の関数MonadCont
) を記述し、 return と bind を作成して、 のようなものを入力しないことは可能Cont (\c -> ...)
ですか?
haskell - Haskell: State モナドの上にインタラクティブなインタープリターを書く方法は?
内部で状態モナドを使用するモデル ファイルシステムに取り組んでいます。次のような操作を持つ型クラスがあります。
cd
、ls
、などのコマンドを提供する小さな対話型インタープリターに取り組んでいますcat
。インタプリタでの操作は、次のように記述できます。
との定義は重要ではOperation
ありResponse
ません。必要に応じて、それらを文字列にしてください。
私が解決しようとしている問題Operation
は、ファイルシステムを解釈して応答を出力する I/O モナドにトップレベルのループを書くことです。IO が FS のインスタンスである場合 (つまり、IO モナドを直接操作している場合)、人生は単純です:
しかし、それは私が望むものではありません。使いたいControl.Monad.State
:
そして宣言する
抽象化を使用して、FS
任意のインスタンスで動作するシングルステップ関数を作成できます。実際、次のコードがコンパイルされます。
この時点で、私は完全に立ち往生しています。 私がやりたいことは、 IO モナドにインタラクティブなループを書くことです。これは s を読み込んでOperation
sを出力できますが、必ずしも IOではないResponse
状態モナドで動作します。(IO にないモデルを持つ理由の 1 つは、QuickCheck プロパティをテストできるようにするためです。)
これは標準的な問題である必要があるように感じます — そうでない ステートフルな抽象化の上にあるインタラクティブな read-eval-print ループ —IO
しかし、私はそれを理解できないように見えるので、息を呑むほど明白な何かを見落としているに違いありません. 私はオンラインで見ましたが、啓発されていません。
呼び出すstep
ことができる対話型の IO 実行計算を作成するための助けをいただければ幸いです。
haskell - 状態モナド Haskell
HaskellでState Monadを使って平均を計算する関数を書きたい これまで書いたコードです
GHCI でコンパイルしたときにこのエラーが発生しました。何が問題なのかを理解するのを手伝ってくれませんか。よろしくお願いします