問題タブ [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 - Haskell-デュアルパーソナリティIO/STモナド?
現在、評価にSTモナドを使用しているコードがいくつかあります。runST
メソッドが純粋な結果を生成し、そのような結果を安全に呼び出すことができることを示しているため、IOをどこにでも配置しないのが好きです(に対してunsafePerformIO
)。ただし、一部のコードが長くなっているため、デバッグ用のprintステートメントをに入れたいと思います。
STまたはIO(タイプまたは「isDebug」フラグに応じて)のデュアルパーソナリティモナド[またはタイプクラスの機械]を提供するクラスはありますか?SPJが彼の「FunwithTypeFunctions」の論文で「Mutation」クラスを紹介したことを思い出します。このクラスでは、結合型を使用してIOをIORefに、STをSTRefに関連付けました。そのようなものはどこかにパッケージとして存在しますか?
編集/解決策
どうもありがとうございました[n回目]、CA McCann!pdebug
そのソリューションを使用して、関数をサポートするモナド用の追加のクラスを導入することができました。ST
モナドはこれらの呼び出しを無視しますが、実行IO
しputStrLn
ます。
これはghciに非常に幸運な結果をもたらします。式はデフォルトでIOタイプであると想定されているため、「test 3」のようなものを実行すると、IOモナドが実行されるため、簡単にデバッグして、実際に実行するときに「testR」のようなもので呼び出すことができます。それ。
haskell - IOタイプを表示
重要な要素としてIORefを含むデータ型があります。show
これは、型クラスのメンバーにするためのクリーンな方法がないことを意味します。print
このタイプのIOモナドに関数があるので、これはそれほど悪くはありません。しかし、GHCiでは、これらのいずれかを返すたびに、表示できないというエラーが発生するという点で煩わしいです。
とにかくIOモナドで動作するGHCiに、IOアクションを使用して結果を表示させる方法はありますか?そうでない場合、書くことへの悪影響はありますshow a = unsafePerformIO $ print a
か?
haskell - HaskellのIOアクションから通常の値を取得する方法
私は次の機能を持っています:
アクションではなく、Chars
そこから価値を引き出したいのです。私はこれをどのように行うのか、あるいはそれが可能であるかどうかさえわかりません。IO
Chars
タイプは基本的に単なるコンテナです。
Chars
詳細はそれほど重要ではありません。この関数がの代わりにを返す方法があるかどうかを知りたいだけですIO Chars
。
そうでない場合、これを引数として?を取る関数に渡すにはどうすればよいChars
ですか?私はHaskellI/ Oに少し慣れていませんがChars
、引数として取るすべての関数を代わりに引数として取りIO Chars
、それらを抽出して再パッケージ化する必要はないと思います。不要のようです。
ありがとう!
haskell - HaskellでIOIntをStringに変換する方法は?
Haskellで入力と出力を使うことを学んでいます。乱数を生成して別のファイルに出力しようとしています。問題は、乱数がを返しているように見えることです。これは、 usingIO Int
に変換できません。String
show
誰かが私にここにポインタを教えてもらえますか?
haskell - 単一のセッションで標準入力へのハンドルを移植可能に何度も開く
コード:
もっとありますが、これは関連する部分です。基本的に、3 行目は複数回評価する必要がありますが、getContents は stdin ハンドルを閉じています。
ハンドルを再び開く方法はありますか?または、 getContents がそれを行うのを防ぐ方法はありますか? (間違ったシグナルを送信しているのかもしれません。Linux で Ctrl-D EOF を送信しています。代わりに EOT などを使用する必要がありますか?)
編集: 目的の動作を得ることができましたが、Windows には移植されません。
新しい質問: stdin へのハンドルをポータブルに開く一般的な方法はありますか?
haskell - この型シグネチャで何が起こっているのでしょうか? (Haskell の Vector.Mutable 修飾子)
Haskell の可変ベクトルには、要素レベルのミューテーターが 3 つあります。
これで問題なく使用できます --
しかし、ここで何が起こっているのでしょうか? とはPrimMonad
? そしてPrimState
コンストラクターですか?
PrimMonad
ここでは、クラスモナドで何らかのバインディングが行われていることを理解しています。thaw
を返しますm (MVector (PrimState m) a)
、どこm
に a PrimMonad
... がありますが、モナドはそれ自体を含んでいますか? m
別のコンテキスト内にあるのはなぜm
ですか?
すべてが基本的に thisPrimState
またはPrimMonad
にバインドされていることがわかりますが、これが変更可能/保存可能なベクトルとどのように関係しているのかわかりません。状態を保存できる型クラスに何か特別なものはありますか?
お時間をいただきありがとうございます!
multithreading - スレッドが出力をインターリーブしないようにする
次のプログラムは、同時に実行される 2 つのスレッドを作成し、それぞれがランダムな時間だけスリープしてから、テキスト行を stdout に出力します。
出力は一般的に次のようになります
一度に 1 つのスレッドだけが stdout に書き込めるようにするにはどうすればよいでしょうか? これは STM が得意とする種類のことのように思えますが、すべての STM トランザクションSTM a
には一部の型が必要a
であり、画面に出力するアクションには型があり、にIO a
埋め込む方法はないようです。IO
STM
haskell - Clojure で Haskell から IO モナドを実行することは可能ですか?
私はalgo.monadsとfluokittenのドキュメントを見てきました。また、 Jim Duey、Konrad Hinsen、およびLeonardo Borgesによるモナドのブログ エントリも読みました。
私が見つけることができる最も近いものは、Konrad Hinsen のライブラリ Monadic IO ストリームです。
これは Haskell で ST を使用した例です
私の質問は、Clojureで Haskell から IO モナドを実行することは可能ですか? 例を挙げていただけますか?