Haskellプログラム内では、ほとんどすべての計算で何かが返され、そのような戻り値を別の計算で取得して、さらに変換を適用できることがわかっています。したがって、通常のHaskellプログラムを「フラット化」すると、次のようになります。
-- pure `a`: comes from Hask; not from file, network or any
-- other side-effected devices
a → a' → a'' → a''' → .... → a_fin
もちろん、この純粋な値は「コンテキスト化」されている可能性があります。しかし、私たちはまだ交互の道をたどることができます:
a → m a → m a' → a'' → n a''' → ... → z a_fin
私にとって、これは、型システムや私たちの自己の欠如によって引き起こされる可能性のある副作用やその他の「驚き」を回避するためにプログラムを制御できることを示しています。しかし、がIO ()
表示されると、欠落しているように見えます。
--!! What happened between the IO () and the next computation ?
a → m a → m a' → IO () >> b → b' → m b'
何も通過/受信していないようですが、IO ()
少なくとも何かを読み書きする必要があります。特に「レシーバー」プロセスを検討する場合:
Sender:: a → m a → m a' → IO () >> b → b' → m b' ... → m b_fin
Receiver:: IO a' → IO a'' → IO a''' → ... → IO a_fin
a
送信者では、の後に何が起こったのかを確認できませんIO ()
。しかし、2つのプロセスの両方を考慮すると、欠落している部分が戻ってきます。ですから、あなたの見方によれば、私たちは情報を見逃した、または見逃していないと言うことができます。これは情報漏えいであり、プログラムに入れるときにプログラムの制御を放棄するだけIO ()
ですか?
ありがとう !
PS。ああ、そして私はまた、Receiverが純粋な値ではなく「コンテキスト化された」値でのみ計算を開始できることを発見しました。それは私の心の中で別の質問が発生します...