問題タブ [monads]
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-MaybeMonad を F# に実装する - どうすればこれを遅延させることができるでしょうか?
F#でhttp://www.haskell.org/all_about_monads/html/maybemonad.htmlから Haskell-MaybeMonad サンプルをビルドしようとしています。
アイデアは、2 つの辞書でメールアドレスを検索することです。両方のルックアップのいずれかが結果を返す場合、3 番目のルックアップを調べます。
問題は、最初のルックアップが結果を返したとしても、2 番目のルックアップを実行することです。Haskell の良いところは、lazy と評価されることです。次に、F# で同様のものを探します。次のことを試しましたが、見栄えが悪く、ビルダーで多分ロジックをカプセル化するという考えが壊れているようです。
より良い解決策はありますか?
よろしく、フォーキ
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 - 非プログラミング用語でのモナド
重複の可能性:
モナドとは?
プログラミング以外の用語でモナドをどのように説明しますか? プログラミングの外側 (FP だけでなく、すべてのプログラミングの外側) に、重要な意味で作用する、またはモナドのようであると言える概念/ものはありますか?
haskell - モナドの「バインド」関数の質問
このように「バインド」関数を定義すると、次のようになります。
結果を新しいモナドタイプにしたい場合、または同じモナドを使用する必要があるが、以前と同じモナドボックスにbを使用する必要がある場合、この定義は役に立ちますか?
haskell - HaskellのmapMは怠惰ではありませんか?
更新:さて、この質問は潜在的に非常に簡単になります。
なぜこれが二度と戻らないのですか?
mapMは無限のリストを怠惰に処理しませんか?
以下のコードがハングします。ただし、A行をB行に置き換えると、ハングしなくなります。または、行Aの前に「splitRandom $」を付けても、ハングしません。
Q1は:mapMは怠惰ではありませんか?そうでなければ、なぜ行Aを行Bに置き換えると「これを修正する」コードになるのでしょうか。
Q2:前の行AのsplitRandomが問題を「解決」するのはなぜですか?
このコードは、乱数の無限のリストを怠惰に生成します。次に、単一の乱数を生成します。splitRandomを使用することにより、無限リストの前にこの後者の乱数を最初に評価できます。これは、関数でcの代わりにbを返す場合に実証できます。
ただし、mapMをリストに適用すると、プログラムがハングします。このハングを防ぐために、mapMの前にsplitRandomを再度適用する必要があります。mapMは怠惰にできるという印象を受けました
monads - Haskell マルチパラメータ型クラスのコンテキストとは
Real World Haskell の第 15 章では、型クラスが定義されています。
数段落後、コンテキストのために >>= と return を定義する必要はないと書かれています。しかし、それが文脈によって何を意味するかについてのこれ以上の説明はありません。
'm' だけが Monad のインスタンスである場合、コンパイラは MonadSupply が Monad のインスタンスであることをどのように認識しますか?
scala - Scalaz を使った Reader モナド
次のように Scalaz で Reader モナドを定義しようとしています。
しかし、コンパイルエラーが発生します:
何故ですか?
ありがとう、リヴァイ
haskell - Haskell Contモナドはどのようにそしてなぜ機能するのですか?
これは、Contモナドが定義される方法です。
これがどのように、そしてなぜ機能するのか説明していただけますか?何してるの?
haskell - HaskellのmapMは厳格ですか?このプログラムがスタックオーバーフローを起こすのはなぜですか?
次のプログラムは正しく終了します。
ランニング:
ただし、無限のリストをフィードすると、プログラムが終了することはなく、コンパイルすると、最終的にスタックオーバーフローエラーが発生します。
ランニング、
getStdRandom
私は、リストからアイテムを選ぶたびに、プログラムが怠惰に評価し、5回行った後に終了することを期待していました。リスト全体を評価しようとしているのはなぜですか?
ありがとう。
乱数の無限のリストを取得するためのより良い方法はありますか?このリストを純粋関数に渡したい。
編集:もう少し読んで、関数が
私が探していたものです。
EDIT2:camccannの答えを読んだ後、私はそれgetStdGen
がすべての呼び出しで新しいシードを取得していることに気づきました。代わりに、この関数を単純なワンショットランダムリストジェネレーターとして使用することをお勧めします。
mapM
しかし、なぜ通話が終了しなかったのかはまだわかりません。明らかに乱数とは関係ありませんが、mapM
多分何か関係があります。
たとえば、次のことも終了しないことがわかりました。
何が得られますか?ちなみに、私見、上記のrandomInts
関数はにあるはずですSystem.Random
。IOモナドでランダムリストを非常に簡単に生成し、必要に応じてそれを純粋関数に渡すことができると非常に便利です。これが標準ライブラリに含まれてはならない理由がわかりません。
haskell - 状態モナド Haskell
HaskellでState Monadを使って平均を計算する関数を書きたい これまで書いたコードです
GHCI でコンパイルしたときにこのエラーが発生しました。何が問題なのかを理解するのを手伝ってくれませんか。よろしくお願いします