問題タブ [do-notation]
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 - 状態モナド、乱数列とモナドコード
私は状態モナドを把握しようとしています。この目的のために、線形合同ジェネレーターを使用して一連の乱数を生成するモナド コードを書きたかったのです (おそらく良くありませんが、私の意図は状態モナドを学習することであり、良い 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 を使うと、動作するコードを作成して期待通りの動作をすることができると思うことがありますが、命令型プログラムで慣れているため、「評価に従う」ことはできません。
list - Haskell リストを一連の do 命令に変換できますか?
関数のリストを作成し、それらを do 表記に渡して順次実行できますか?
私は現在、データのリストをマッピングすることでこれを行っていますが、何らかの方法で結果を一連の順次呼び出しとして渡すことができるかどうか疑問に思っていますか?
haskell - Haskell で独自の構文シュガー (do 記法や矢印記法など) を展開することは可能ですか?
さて、質問は自明です。楽しみのためだけに特別な構文を実装したいとします。出来ますか?どのツールを使用すればよいですか?
haskell - Haskell-「do」ブロックで「if」ステートメントを正しく使用するにはどうすればよいですか?
重複の可能性:
HaskellはIOを「何もしない」、または他にない場合
これらの「簡単な」行で問題が発生しました...
GHCiは識別子について苦情を申し立てるか、追加した後の最後の行のアクションを実行しませんelse do
。
例外処理は機能するかもしれないと思いますが、そのような一般的な「チェックして何かをする」ステートメントでは必要ですか?
ありがとう。
haskell - Haskell の do ブロックでの簡潔な if-then-else 表記
[ http://hackage.haskell.org/trac/haskell-prime/wiki/DoAndIfThenElse ]で言及されている簡潔な if-then-else 表記を機能させる方法がわかりません。これは機能し、
しかし、これはそうではなく、上記のセミコロン(リンクを参照)を挿入すると、解析エラーが発生するだけです。
haskell - Haskell IF Else
then
この種のシナリオでは、またはで複数の putStr を使用する方法はelse if
?
エラーを取得しようとすると
scala - ScalaのHaskell do表記またはF#計算式と同等ですか?
F# 計算式を使用すると、モナド構文の複雑さを厚い構文糖衣層の背後に隠すことができます。Scalaで利用できる同様のものはありますか?
理解のためだと思います...
例:
しかし、それは本当に正しくありません。より良い構文はありますか?
たとえば、haskell では次のようになります。
これは、scala とは異なり、foreach ループのようには見えません。Scala 構文は、別個の概念であるリスト内包表記との結合が強すぎるようです。これにより、奇妙に見えない内部 DSL (モナド) を書くことができなくなります。
haskell - モナドの脱糖化表記
do
Haskellを学んでいると、表記法は単なる糖衣構文であることに気づきます。
に翻訳
おそらくdo表記を使用することは理解していますが、翻訳で何が起こっているのかを理解したいと思います。純粋に教育的な理由で、ghc / ghciがdo表記で書かれたかなり複雑なモナドに対応するバインドステートメントを提供する方法はありますか?
編集。#haskellのlambdabotがこれを実行できることがわかりました:
Undoプラグインのソースコードは次のとおりです。
haskell - (>> =)の実行順序は私が期待したものではありません
一連のネットワークリクエストがあり、それぞれに10秒以上かかります。
ユーザーが何が起こっているかを知ることができるように、私は更新を提供します:
GHCiを使用すると、これは期待どおりに機能しますが、コンパイルまたはrunghcを使用すると、「ダウンロード」は「完了」まで印刷されません。
(>> =)と(>>)で書き直しましたが、同じ問題が発生します。
どうしたの?