私はモナスを使ってディスクI/Oのような副作用を追跡できるHaskellのような純粋な関数型言語の魅力を理解しています。副作用とは何か?なぜメモリ割り当てが副作用ではないのですか?
なぜすべてのシステムコールが副作用と考えられるのですか?たとえば、Haskellのヒープメモリ割り当て(自動)は追跡されません。そして、スタックの割り当ては副作用がありますが、それは役に立つとは思えません。どちらもシステムの全体的な状態を変更します。
したがって、副作用とは何のために描かれた線はどこですか?それは単に最も有用なものにありますか?あるいは、より理論的な基盤がありますか?
私は、割り当てが副作用であった場合、非常に少ないものが「純粋」であり、そのようなものはコンセプトの有用性を低減するということです。純度には、1つの普遍的な厳密な定義がありません。私は、割り当てを副作用として扱い、少量のメモリ(組み込みシステム)を持つシステムで非常に有用な型システムを通してそれを管理する言語を想像することができましたが、私は何も知らないそのような言語は現在ありません。 –
メモリ割り当ては、発生するタイミングを制御したい場合は副作用です。 IORef/STRef/FunPtrラッパーを参照してください。それが自動的に起こっている場合、コンパイラがそれについて賢明であると信じることができるので、Haskellはそれを心配するよう強制しません。 –
@AlexisKing組み込みシステム用のコードを書かなければならないことがあります。私はそれがHaskellでDSLとして記述できると思いますが、非常に効率的にコンパイルされたスタンドアロン言語としてはクールです。 – bheklilr