問題タブ [unsafe-perform-io]
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 - コンパイル時または実行時にランダムな文字列を生成し、プログラムの残りの部分で使用します
これを行う最良の方法は何ですか?unsafePerformIO
? テンプレート Haskell? 他の何か?どちらも使ったことがないので、詳しい使い方はわかりません。
プログラムは実行されるたびにコンパイルされるため、コンパイル時または実行時に文字列を生成するかどうかは問題ではないことに注意してください。また、コード全体の多くの場所でこの文字列を使用する必要があるため、実際には「適切な」方法でそれを行うことができず、それを IO アクションにすることはできません。IO モナドに他のコードをあまりにも多く配置する必要があります。 .
haskell - タイムアウトと unsafePerformIO
System.Timeout
Haskell の練習をして、よく知らない領域を調べていますが、 と を混合しているときに得られる動作を理解できませんでしたSystem.IO.Unsafe
。
でストリームを怠惰に読み取り、getContents
純粋な関数でフィルタリングし、結果を出力しています。典型的なフィルターは次のようになります。
そして、そのようなフィルターを使用すると、プログラムは期待どおりにすべての stdin を読み取り、stdout に出力します。しかし、私が次のようなことをすると:
私のプログラムは即座にタイムアウトし、「Timeout!」を出力すると思います。メッセージを表示して閉じます。代わりに、そこでハングして、入力を待ちます。
timeout
関数がプログラムの起動時に評価されると考えるのは間違っていますか? 戻り値の一部をすぐに stdout に書き込み、行を入力するたびにソフトウェアが反応するため、そうなると思います。unsafePerformIO
関数にある種の怠惰を挿入していますか? それとも、の内部に怠惰を挿入していSystem.Timeout
ますか?
haskell - 安全でない FFI をラップする方法は? (ハスケル)
これは、unsafePerformIO を使用する正当な理由はありますか?に対するフォローアップの質問です。
だから私たちはそれを知っています
は安全ではないため、 では使用できませんunsafePerformIO
。
しかし、p_sin
関数は依然として数学関数であり、安全でない方法で実装されたという事実は実装の詳細です。たとえば、一時メモリの割り当てを伴うという理由だけで、行列の乗算を IO に含めたくありません。
この関数を安全な方法でラップするにはどうすればよいでしょうか? 自分でロックしたり、メモリを割り当てたりする必要がありますか? これに対処するためのガイド/チュートリアルはありますか?
haskell - (編集済み) Haskell で IO なしで乱数を取得する方法
stdGen
IO を使用せずに、呼び出しごとに異なる値を返す関数が必要です。unsafePerformIO
次のコードとして、を使用しようとしました。
しかしmyStdGen
、ghci を呼び出そうとすると、常に同じ値が返されます。私は虐待しましたunsafePerformIO
か?または、私の目標を達成するための他の方法はありますか?
編集 申し訳ありませんが、質問をもっと正確に説明する必要があると思います。
実際には、特別な「マージ」操作が必要な、treap データ構造のバリエーションを実装しています。償却されたO(log n)の予想時間の複雑さを保証するために、ある程度のランダム性に依存しています。
(Tree, StdGen)
トラップごとに乱数発生器を保持するようなペアを使用しようとしました。Treap に新しいデータを挿入するときはrandom
、新しいノードにランダムな値を与えてから、ジェネレーターを更新します。しかし、問題が発生しました。empty
空の treap を返す関数myStdGen
を呼び出しました。上記の関数を使用して、この treap のランダム ジェネレーターを取得しました。ただし、空の treap が 2 つある場合、それらStdGen
は同じになります。したがって、両方の trap にデータを挿入した後、それらをマージしたい場合、それらのランダム値も同じになります。そのため、頼りにしていたランダム性を失いました。
そのため、呼び出しごとに異なる結果を生成する、何らかの形で「グローバルな」乱数発生器がStdGen
必要なため、空の Treap ごとに異なるStdGen
.
haskell - Haskell - 変更されないファイルからグローバル変数が必要
変更されない辞書ファイルからアナグラムを検索するためのマップを作成するこの関数があります。他の関数で使用する必要があるため、マップをグローバル変数として使用したいと考えています。現時点では、関数は buildAnagrams で unsafePerformIO を使用していますが、推奨されていないことを認識しています。マップを複数回構築しているため、プログラム全体も非常に遅くなります。これを行うためのより良い方法があるはずですか?
haskell - 効果的な機能のメモ化
セルオートマトンをローカル遷移関数として定義するプロジェクトに取り組み始めました。
g
が であるときはいつでもMonoid
、ローカル遷移を適用する前にフォーカスをシフトすることにより、グローバル遷移を定義できます。これにより、次のstep
関数が得られます。
これで、 を使用してオートマトンを簡単に実行できますiterate
。memo
そして、各ステップを izing することで、再計算を大幅に節約できます (つまり、文字通り何時間も節約できます) 。
私の問題は、ローカルルールで副作用を使用できるように一般化Cellular
したことです(たとえば、ランダムな隣人をコピーする):CelluarT
ただし、効果を 1 回だけ実行して、セルの値を複数回尋ねても、答えがすべて一致するようにしたいと考えています。結果ではなく有効な計算memo
を保存するため、ここでは失敗します。
安全でない機能を使用しなければ、これが達成できるとは思えません。unsafePerformIO
、 an 、IORef
および aを使用して、Map g a
既に計算された値を保存しようとしました。
しかし、それは予測不可能な方法で動作します:同じ引数が渡されているにもかかわらず、行をフェッチし続けるmemoM putStrLn
間、正しくメモ化されます。memoM (\ str -> getLine)