純粋函数型言語で,入出力をどう処理するんだろう,副作用発生するし計算機資源的に羃等でもないし……と疑問だったんだけど,この記事によると「(純粋)函数型言語では入出力を実装できないので,〝普通の〟プログラムで補う」そうだ。うーん……?https://alvinalexander.com/scala/fp-book/pure-functions-and-io-input-output/
Conversation
Notices
-
B̅ (cmplstofb@mathtod.online)'s status on Wednesday, 02-Dec-2020 00:47:37 JST
B̅
-
まちカドおるみん御嬢様 (orumin@mstdn.maud.io)'s status on Wednesday, 02-Dec-2020 00:47:30 JST
まちカドおるみん御嬢様
@cmplstofB モナドで純粋性を維持するのでちょっと違う
-
まちカドおるみん御嬢様 (orumin@mstdn.maud.io)'s status on Wednesday, 02-Dec-2020 00:54:39 JST
まちカドおるみん御嬢様
@cmplstofB 私もべつに函数型は詳しくもないし未だにちゃんと書ける気はしないけれど、Haskell における Monad は圏論との絡みや抽象的定義は一度置いておいて、実用的には、たとえば文字出力だと常に unit 型とか返しておけば参照透過性は担保できるけど副作用が前提になるからよろしくないのを、Monad に包んでしまって解決するという認識
-
B̅ (cmplstofb@mathtod.online)'s status on Wednesday, 02-Dec-2020 00:54:40 JST
B̅
@orumin そうですか……。ありがとうございます。(函数型プログラミングをちゃんと勉強したいんですが,初歩の初歩でずっと停滞しています……)
-
まちカドおるみん御嬢様 (orumin@mstdn.maud.io)'s status on Wednesday, 02-Dec-2020 00:59:51 JST
まちカドおるみん御嬢様
@cmplstofB (実装でそのようになっているかはともかく)、IO Monad を返り値にしておいて、副作用として作用する対象の世界(IO ならターミナルとか)そのものを返り値にしてしまえば、副作用ではなくただの作用になるし、副作用のある関数を連続で実行するのと同様の操作についても、Monad で包んで返した環境を受け取って操作をして Monad で包んで返す、という建付けにしておくと、参照透過なままで居られる気持ち
-
まちカドおるみん御嬢様 (orumin@mstdn.maud.io)'s status on Wednesday, 02-Dec-2020 01:01:43 JST
まちカドおるみん御嬢様
@cmplstofB 単に framework として見たときは、副作用のある操作が型で明示されるし、Monad の函数のチェーンと純粋な函数の部分がはっきり分離できる(というか分離が強制される)から便利、という認識。
-
B̅ (cmplstofb@mathtod.online)'s status on Wednesday, 02-Dec-2020 01:04:15 JST
B̅
あれ,そうすると,元の記事の「(純粋)函数型言語ではI/Oは実現できない」というのは微妙に間違えてるってことです? それとも〝Monadで包む〟という建て付けが既に言語の函数性を〝純粋〟でなくしてしまっている?
-