セカイノカタチスマートフォン用の表示で見るセカイノカタチ世界のカタチを探求するブログ。関数型言語に興味があり、HaskellやScalaを勉強中。最近、オブジェクト指向と関数型を比べる人が多くなってきたみたいなんで、自分の考えをまとめてみます。本件ですが、壮大なテーマだと思いますので、全体を網羅して書くのは難しいです。主眼は、ズバリ「副作用」です。副作用とは、薬なんかだとその薬が目的とする「作用」に付随してくる好ましくない「作用」の事を指しますよね。風邪薬を飲むと「眠くなる」とか、タミフルを飲むと「ベランダから飛び降りたくなる」*1とかです。プログラミングに於いては、関数の戻り値を「作用」として、それ以外の作用を(良し悪し関係なく)「副作用」といいます*2。副作用によって、プログラム全体の動作が複雑になり、わかりにくくなるため、最近のプログラマー達の議論では「悪」であるということでコンセンサスが取れているようです。関数型言語と副作用の戦い関数型言語における、対副作用兵器は「参照透明性」です。関数から、副作用そのものを排除してしまおうという発想で、変数は定義と同時に値が確定し、その後変更できませんし、関数も戻り値以外にプログラム内部の状態を変更できません。このため、関数は同じ引数ならば必ず同じ結果を返すことが保証され、副作用の心配から根本的に開放されます(やった!)。ここまでの(過激な)機能が備わっていない言語でも、なるべく副作用がないプログラムを書こう!というのが関数型プログラマーの戦闘スタイルです。完全に副作用がないプログラムと言うのは実現できません。変化のないプログラムは現実世界の我々にとって役に立たないからです。そのために実際は副作用の発生する領域と、副作用の無い純粋な領域を分離して使います。詳しくは、下記の記事で書きました。セカイノカタチ副作用の無い世界とある世界を完全に分離するそして、副作用がない世界をなるべく多く確保し、副作用がある領域は慎重に管理するこれが、関数型言語の生存戦略です。オブジェクト指向言語と副作用の戦い「副作用」という発想自体が、関数型方面発祥なため(ですよね?)、オブジェクト指向プログラミングでは、「副作用は野放し」と思われてる方も多いかと思いますが、違います。オブジェクト指向言語における、対副作用兵器は「カプセル化」です。森羅万象、あらゆるものをオブジェクトとして捉え、クラスを定義しインスタンス化していく事で現実世界をコンピュータの中に再現する。これがオブジェクト指向プログラマーの戦闘スタイルですが、インスタンスというのは副作用をパッケージしたものです。逆に言うと、副作用が無いのであればインスタンスの存在価値は希薄になります。自分は、Haskell→Scalaというコードの移植を(趣味で)よくやるのですが、ほとんどインスタンスが必要ないコードになります。あっても単純にデータ構造を表すことになるので、クラスである必要がないです。Cで言うところの構造体みたいなもので十分ということになります*3。オブジェクト指向のインスタンスは、副作用を管理する箱です。副作用というのは変化する値ですが、野放しにすると危険なので箱に入れて専用の関数経由でしか変更できなくします。副作用同士が反応すると危険が増幅する性質があるため、箱はなるべく小さく設計し、箱同士のメッセージ交換によって動作するようにします。これが、オブジェクト指向言語の生存戦略です。まとめると関数型とオブジェクト指向で、「副作用」に対するアプローチは180度違います。関数型は副作用を「外的なもの」として扱い、main関数(つまり外界)から繋がったエリアの内、副作用を必要とする領域を隔離する事で安全性を保とうとします。対して、オブジェクト指向では、副作用をなるべく小さい単位で「内側に封入」しようとします。この態度の違いは本質的で、コーディングテクニックがどうこうという問題では無いと思います。なんで、両者の食い合せは悪いのかな。あって完璧ではないんで、住み分けたり使い分けたりする必要があるし、お互いの良い所は可能な限り取り込んで、より良いパラダイムを作っていったらいいんじゃないかと思います。いうことで、やっぱりトムとジェリーは偉大だった*4。*1:本当かどうか知りません*2:少なくともここではそういうことにしておきます*3:実際は代数的データ型を表すのに継承とかが欲しい。2015(Qiita版)14日目の記事です。#haskell第2期第23回H本読書会を開催しました。セカイノカタチqt...2015-05-13プログラミング言語の難しさはより遠くに飛ぶための翼である複雑さについて思うこと。はてなブログProシステム開発の世界で15年の山の民による、世界のカタチを探求するブログ。(4)はてなブログをはじめよう!qtamakiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。