問題タブ [io-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 - FilePath をマップして連結するにはどうすればよいですか?
私はまだ Haskell、特に IO モナドを理解しています。
ディレクトリパスのリストがあります。たとえば、
["/some/path", "/another/path", "/yet/another/path", "/still/more"]
そして、このリストを、次のように、これらの各パスの完全修飾コンテンツのリストにマップします (.
およびなし..
)。
["/some/path/file.1", "/some/path/somedir", "/some/path/file.2", "/another/path/file.a", "/another/path/a/directory", "/another/path/file.b", "/still/more/file.alpha", ...]
次のようなある種の二重マップでこれを行うことができると思います。
pathItems <- mapM (\pd -> MapM (\contents -> (pd </>) contents) (getDirectoryContents pd) pathDirs
しかし、これは機能しません。私が得ているエラーはこれです:
haskell - エラーの後にGHCIがエラー状態で「スタック」するのはなぜですか?
まず、タイトルが意味不明で申し訳ありません。実際に何が起こっているのかわからないので、これ以上具体的にすることはできません。
さて、私の質問です。Haskellの 99 の問題のうち 23 の問題について、次のスニペットを実装しました。これはn
、リストから項目をランダムに選択する必要があります。
これをロードするとghci
、有効な引数に対して正しく機能します。
ただし、範囲外のインデックスを使用すると、奇妙なことが起こります。
ご覧のとおり、次の 2 つの (私にとって) 予期しないことが起こります。
- エラーを直接与える代わりに、最初に入力の順列を出力します。
- 一度エラーが発生すると、まったく実行されなくなります。
1. は遅延評価と関係があるのではないかと思いますが、なぜ 2. が起こるのかまったくわかりません。何が起きてる?
sockets - Haskell で IO 再帰ループをモナド折りたたみにリファクタリングする
私はtcpサーバーを書いています。これが私のメインループメソッドです:
(注:handleConn :: Socket -> IO ()
私のプログラムに固有の機能です。)
それをよりモナド的な方法にリファクタリングしたいと思います。ここに私の暫定的な方法があります:
しかし、これにより、ソケットを介してデータの送信を開始するとすぐにプログラムがクラッシュします。
ここに私の質問があります:なぜですか?その修正は何ですか?
haskell - IO モナドと順序付け
私は IO モナドで遊んでおり、Haskell で副作用を利用することを学んでいますが、間違っているようです。
次のコードを検討してください。
ここでの私の理解は、do
3 つの IO モナドを 1 つに「接着」するということです。私の仮定は、それらが順番に実行されることです。つまり、「test」が最初に出力され、次に行が読み取られ、次にダミーreturn ()
が生成されます()
ただし、コンパイルされたアプリを実行すると、「テスト」を出力する前に行が読み取られるのを常に待機します。
並べ替えputStr
/getLine
何もしません。次のように、IO モナドから値を「アンラップ」します。
...結果も変わりません。
ここで何が欠けていますか?IO アクションの順序を強制する方法は?
haskell - do ブロックや累積括弧のない慣用的な Haskell 構文?
私は Haskell にかなり慣れていないので、C ライブラリを処理する関数に複数の IO 汚染値を渡す方法を見つけようとしています。ほとんどの人は、次のように do ブロック内で <- 演算子を使用しているようです。
これは、emacs が自動インデントできないことを除けば、C をやっているような気分にさせてくれます。私はこれをもっと Lisp スタイルで書こうとしました:
これはごちゃごちゃしているように見え、最後に数えなければならない一連の閉じ括弧があります (ただし、emacs は Lisp ではこのタスクを確実に支援できますが、Haskell では支援できません)。さらに別の言い方は、
これはきれいに見えますが、基本言語の一部ではありません。
IO 汚染ボックスから値を剥がすための、より簡単な表記法はありますか? おそらく、リフト*またはfmapを使用したよりクリーンな方法はありますか? 「慣用的」と見なされるものを尋ねるのが主観的すぎないことを願っていますか?
また、emacs を (Haskell Ind) モードよりもうまく連携させるためのヒントをいただければ幸いです。ありがとう!
ジョン
編集: https://wiki.haskell.org/Do_notation_considered_harmfulに出くわし、私が書いたラムダ チェーンのネストされた括弧は必要ないことに気付きました。しかし、コミュニティ (および ghc の実装者) は、 <*> などを使用して Applicative にインスパイアされたスタイルを採用しているようです。これにより、演算子の優先順位を理解するという頭痛の種にもかかわらず、コードが読みやすくなっているようです。
haskell - IO でラップされた遅延リスト
コードを仮定します
g
ghci で実行すると、stackoverflow が発生します。[0, 0, 0]
しかし、私はそれが怠惰に評価され、製品がに包まれるのではないかと考えていましたIO
。ここにIO
責任があると思いますが、本当にわかりません。明らかに、次のように機能します。
編集:実際、私はそのような単純な関数を持つことに興味がありませんf
。元のコードは次のように見えました:
h
いくつかのIO
計算を行い、有効な応答 ( ) が生成さLeft
れるまで無効な ( ) 応答をリストに格納します。モナドRight
内にいるにもかかわらず、リストを遅延して構築しようとしています。IO
の結果を読んでいる人h
が、リストが完了する前であってもリストの消費を開始できるようにします (リストは無限になる可能性があるため)。そして、結果を読む人3
が何があっても最初のエントリだけを気にするのであれば、残りのリストを構築する必要さえありません。そして、これは不可能だと感じています:/。