関数型プログラミング言語Haskell Part34 (657レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) レス栞 あぼーん
303(1): 2024/07/26(金) 05:41:42.96 ID:JmafwQnp(1/3)調 AAS
>>302
それはそうで、IOモナドは他の言語例えばC言語系列だとhoge();の";"部分を数学的に表現しただけだから。
見た目だけなら
x = x + 1;
printf("%d\n", x);
を
return (x + 1) >>= \x -> print x
do形式に直して
x <- return (x + 1)
print x
ただ、x <- の部分は同名の別の変数をシャドーイングしてるので、厳密にメモリの動作まで合わせるならIORefを使う。
Haskellから見たらメモリもIO処理(ファイル処理含む)も等しく外部への入出力という扱い。
だから、実用としては意味が無い。
一見複数行に見えるコードがその気になれば全部一行に出来るという感動はあるが、それだけだ。
Haskellを仲立ちにして数学とプログラミング言語の関係を研究したりには便利。
逆に自力でIOモナドをPythonなどの適当な言語で実装して全てのコードを関数っぽく書ける。
(Pythonだと演算子の自作が出来ないのでf = (>>=)みたいな事になる)
Haskellは便利だから使うものじゃない。
美しいから使うものだ。
あ、でも腐っても最新版は実行速度が結構上がってる(C#/Java並み)ので、選択肢から外される理由も減ってきた気がする。
304(1): 2024/07/26(金) 05:47:41.29 ID:JmafwQnp(2/3)調 AAS
そこまで気づくと、Gtk2hsとかWin32とかのC/C++からのラッパーライブラリを関数型言語っぽくない!って拒否する気持ちが分からなくなる。
305(1): 2024/07/26(金) 06:16:02.54 ID:JmafwQnp(3/3)調 AAS
あ、IOモナドの利点一応あった。
入力関数が他の関数の引数になったり、他の関数に関数合成出来ない。
Pythonのprint(input())みたいなコードや、len(input())みたいなコードは無理。
ここをしっかり分けることで、そういう変な使い方でのエラーは出ない。
もっと広い視点で言えば、入出力がIOモナドという型で分かれているのでネストの深いループの中でも入出力時に型を意識する必要があるので、そういうバグが大分減る。
手続き型関数型関係なく、ネストの深いループの中のデータが今どんな状態かを頭の中で把握出来る人はそう多くない。
だから、デバッグ時に解きほぐしていくんだが、関数型の方が切り分けしやすいかも?
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 1.294s*