問題タブ [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 - 「モナド構造」と「構造の要素」は、任意のモナドのコンテキストで正確に何を意味しますか?
Control.Monad のドキュメントを読んで、mapMのそのような説明を見つけました:
構造体の各要素をモナド アクションにマップし、これらのアクションを左から右に評価し、結果を収集します。
興味があります.任意のモナドにとって「構造体の要素」とはどういう意味ですか? 例えば、State
またはIO
モナド?どんな構造?私はmapM
関数が何をするかを知っており、mapM
. この「構造」は「代数的構造」の概念と何らかの形で結びついているのでしょうか?
構造は、公理のリストを満たす 1 つ以上の有限操作が定義された集合です。
もしそうなら、IOモナドなど、私が求めたこの構造(キャリアセット)の要素は何ですか?一般に?
haskell - 持ち上げられた「if」関数が予期しない動作をする
私のプログラムif'
では、組み込み構造の代わりに、モジュールの 1 つで定義された関数を使用していますif-then-else
。それは自明に定義されており、うまく機能します。
ただし、モナド値に適用する必要があるコードの場所が 1 つあります (IO
私の場合)。つまり、型シグネチャは のようになりますIO Bool -> IO a -> IO a -> IO a
。当然、持ち上げてみました。
しかし、式を評価しようとすると、期待どおりの結果が得られません。
<*>
説明に「逐次適用」と書いてあるのは知っているので、そのせいかもしれません。しかし、ここで何が起こっているのでしょうか? まったく新しい専用関数を作成せずに修正できますか?
haskell - Parsec と liftIO、コンパイル エラー
言語を解析していますが$include
、解析中に他のファイルへの構文が必要です。
私のコード:
GHC からのエラー メッセージ:
どうすればそれを機能させることができますか?
haskell - どのような意味で IO モナドは特別なのですか (もしあれば)?
モナドに飛び込んだ後、モナドは何らかのコンテキスト (失敗、非決定論、状態など) 内で計算を連鎖できるようにするための一般的な概念であり、その背後に魔法がないことを理解しました。
それでも IO モナドは魔法ではなく特別な感じがします。
- 他のモナドのように IO モナドをエスケープすることはできません
main
IO アクションは関数によってのみ実行できます- IO は常にモナド トランスフォーマー チェーンの一番下にあります
- IOモナドの実装は不明確で、ソースコードはいくつかのHaskellの内部を示しています
上記の理由は何ですか?IO が特別な理由は何ですか?
更新:純粋なコードの評価順序は関係ありません。しかし、IO を実行するときは問題になります (それを読む前に顧客を保存したい)。私が理解していることから、IOモナドはそのような順序保証を提供してくれます。それは一般的なモナドの特性ですか、それとも IO モナドに固有のものですか?
haskell - 例で IO モナドと State モナドを組み合わせる
ステートメントの簡単なエバリュエーターを作成しました。トランスフォーマーを使用してそれを行いたいと思います-IOモナドと状態を混ぜます。
誰かがそれを行う方法を説明できますか? それは私が対処できないものです-トランスフォーマー。
haskell - ロールバック IO アクション
(ある程度) ロールバックできる一連の IO アクションを処理するための非常に単純な抽象化があります。つまり、アクションがファイルを書き込む場合、ロールバックはこのファイルを削除するか、アクションがディレクトリ ツリーを作成する場合はプルーニングします。それはロールバックなどになります。
それは私が望んでいることのほとんどを行いますが、それを行うには、より構成可能で信頼性の高い (例外処理の意味で) 方法があるという強い予感があります。私の質問は、たとえば、ライブラリの既知のモナド変換子を使用して、同じアイデアを実装できますか?
のようなものを持つ
現在のソリューションよりも便利です。
haskell - IOモナドは埋め込まれたmapMの短絡を防ぎますか?
次のコードでやや当惑しました。問題のおもちゃではないバージョンでは、モナド結果でモナド計算を実行しようとしています。その値は、IO 内からのみ構築できます。IO の背後にある魔法がそのような計算を厳密にするようですが、それがどのように起こるのか正確にはわかりません。
コード:
出力:
javascript - IO モナドに含まれる合成関数は、望ましくない効果がないことが保証されていますか?
純粋なコードと純粋でないコードを分離するために IO が使用されていることを理解しています。また、IO が参照透過性を可能にしていることも承知しています。
ただし、IO に関する 1 つのことは、まだ少しわかりにくい点です。つまり、呼び出されたときにすべてが一度に実行されるため、IO に含まれるアクション間で悪いことが起こらないことが保証されます (遅延構成にすぎないため)。そのため、この遅延構成が最終的に呼び出されると、他の並行コードはそれを歪めることはできません (この遅延構成)。
それで、それは本当ですか?(このコンテキストでは) IO は、このようなコードよりも優れているでしょうか?
IO がそのような問題の解決策であることを理解しています。
私の推論は大丈夫ですか?