構造体またはクラスのインスタンス。ほとんどの開発者が命令型/手続き型スタイルのプログラミングに慣れています。純粋関数型スタイルの開発に移行するには、考え方を切り替えて、開発に適用する方法を変える必要があります。コントラクトの観点から考えます。何より重要なのはオブジェクト型の動作と状態であり、それに対処するために、クラス、インターフェイス、継承、ポリモーフィズムなどの言語機能が用意されています。つの課題として捉えます。関数型プログラミングでは、状態や変化するデータを避け、関数の適用を重視します。関数型・宣言型プログラミングとオブジェクト指向・命令形(手続き型)プログラミングを、対比的なパラダイムとして解説しています。「考え方を切り替える」、「開発に適用する方法を変える必要がある」ことが論じられています。この解説が広く一般的です。2次に、現在「関数型プログラミング」で検索すると、Google上位にヒットする、英語の記事の翻訳です。上記マイクロソフト記事と同様に、2015年現在の日本国内の歪な言論状況には影響を受けていません。【翻訳】2015年の最優先事項は関数型プログラミング!https://medium.com/@jugoncalves/functional-programming-should-be-your-1-priority-for-2015-47dd4641d6b9—もはやOOP(オブジェクト指向プログラミング)は”クラウドモンスター”から私たちを守りきれないおそらくあなたは、”Clojure”、”Scala”、”Erlang”といった言葉や、”Javaにラムダ式が導入された”という話を聞いたことがあるでしょう。それらの言葉が”関数型プログラミング”と関連があるのをご存じかもしれません。プログラミングコミュニティに参加していれば、おそらく既にこのテーマが議題に上がっているでしょう。オブジェクト指向プログラミングは私たちを守りきれない私たちはとうとう、分散処理や並行処理を実行するアプリケーションを持つようになりました。残念なことに、まだその準備はできていません。並行処理や並列処理を行う”現行の”(すなわち最も使用されている)モデルでは、たとえ問題を解決できても、多くの複雑さが伴います。優れたアプリケーションには、そのためのシンプルで信頼性の高い方法が必要です。取得した結果と異なる結果を出すことのない1つの関数を、別々のコアやマシンで1,000回実行できるということです。1つのコアで実行するコードを1,000個のコアで使用することもできます。これでまた救われます。少なくとも並行処理や並列処理に関しては、もうOOPはあなたを守りきれません。いうのも、OOPが可変状態に直接依存しているからです(OOP実装として最も一般的な、命令型言語において)。呼び出すオブジェクトのメソッドが、現在のselfやthisを変えるものと想定されているのです。全てのスレッドが正しくアップデートされ同期するよう保っていくには、かなり複雑な対処が必要となるでしょう。私はここで、現在あなたの使っているパラダイムが何であれFPへ移行すべきだと主張するつもりはありませんが(そうすべきだと言う人もいるでしょうが)、FPをマスターする必要があるのは間違いありません。JavaとC++11は既に、ラムダ式を取り入れているのです。近いうちに、ほぼ全ての現代的でメンテナンスされている言語は、FPの機能に依存するようになるでしょう。大半はそうなっています。コミュニティ」なるもので活動で勤しむ方々からは、きっと「キチガイ」扱いされてしまうのでしょう。OOPが可変状態に直接依存しているからです(OOP実装として最も一般的な、命令型言語において)オブジェクト指向が一般的に、命令型パラダイムであり、宣言型ではない、ミュータブル(可変状態)であり、参照透過ではない、というのは、これは基礎中の基礎のコンセンサスが世界的に存在しているはずで、上記のような言及はごくごく常識的でまっとうで、普通のものであり、私もまったく同じことを繰り返し書いているだけです。Developmentオブジェクト指向だけじゃない開発宣言http://notonlyoo.org/というサイトが存在します。私たちは、ソフトウェア開発の実践あるいは実践を手助けをする活動を通じて、よりよい開発方法を見つけだそうとしている。この活動を通して、私たちは以下の価値に至った。左記のことがらに価値があることを認めながらも(但しnullは除くが)、私たちは右記のことがらにより価値をおく。双方を対比的に比較しているわけです。繰り返しになりますが、上記のような言及はごくごく常識的でまっとうで、普通のものであり、私もまったく同じことを繰り返し書いているだけです。(Amazonリンク)という、オライリーという、プログラミング界では広く認知されている出版社から刊行されている関数型プログラミングの解説書の紹介文です。APIに焦点を絞り、これらを使った関数型プログラミングについて解説します。今までのJavaには存在しなかったこの新しいパラダイムに踏み込むことで、冗長さを排し、より簡潔なプログラミングを実現します。これを使いこなすためには、従来のJavaにおける考え方を一旦捨て去り、新たな考え方をもってプログラミングを行わなければなりません。「従来の考え方を一旦捨て去り、新たな考え方をもってプログラミングを行わなければならない」旨がかなり明確に強調されています。繰り返しになりますが、上記のような言及はごくごく常識的でまっとうで、普通のものであり、私もまったく同じことを繰り返し書いているだけです。関数型言語とオブジェクト指向の研究は両者とも同じ数学的基盤に支えられて行われています。オブジェクト指向と関数型は対立していますか?いいえ、両方とも基礎理論はほとんど同じ人たちが研究していますし、純粋関数型オブジェクトの理論もあります(第32章)。オブジェクトと第一級関数やデータ抽象の考え方(第2章・第3章)など、類似も少なくありません。フェライゼンというScheme等の著名研究者による「オブジェクト指向プログラミングに関する欧州会議」(ECOOP)における基調講演(特に22ページ目)や、ワドラーというHaskell等の著名研究者による「オブジェクト指向プログラミング・システム・言語・アプリケーションに関する国際会議」(OOPSLA)における基調講演等々もあります。色付きのスタンスの人々による珍妙な言説(かつ手口としては権威主義的強弁)が「一般的だ」と【自称】「関数型コミュニティ」においては強弁され続けて、挙句の果てに私のように人格否定までされているわけです。「考え方を切り替えて、開発に適用する方法を変える必要があります。「従来の考え方を一旦捨て去り、新たな考え方をもってプログラミングを行わなければならない」といった転換を有耶無耶にするための行為であることは明々白々であり、何故そんなことをわざわざ「一般的だ」と「嘘」をついてまで強弁するのか?そこには、知的誠実な学究的態度は見受けられず、知的誠実でない排他的宗教的より好み、スタンスによる感情的な反発があると見做さざるを得ません。事情を知る傍観者は、自分まで妙な個人攻撃の餌食になってはたまらない、と口をつぐむ。オブジェクト指向と関数型は対立していますか?「いいえ」と断言しているので、どんなものかと読み進めてみると、文章の最後には上の記述はあくまで理論の話です。紹介記事の冒頭に書いたとおり、「単純な関数型言語に、複雑なオブジェクト指向はいらない」という考え方もあります(私個人の好みもそれに近く、OCamlのOはほとんど使っていません。ような、言い逃れのような玉虫色のわけのわからない事でお茶を濁されてしまい、馬鹿をみるのは、真面目に読んで混乱して終わった学習者だけなので、こういう説明は止めてもらいたいです。そもそも、「上の記述はあくまで理論の話です」というオチのようだが、「オブジェクト指向」というのは、そもそも「理論」ではありません。文字通り「指向」、パラダイムであって、理論ではない。文中にある、このFPvsOPの議論のそこら中で大変重宝されているようにみえる常套句であるが、非常に「トリッキーな概念」であるので要注意。いうか、はっきり言うと単なる我田引水の「誤魔化し」である。あらゆる概念において、どの角度で切って分析するか?によって、常に「直交・独立な概念」を切り出すことが可能であるから。>要するに、オブジェクトの状態を破壊的に更新するか(命令型)、新しい状態を持つオブジェクトを作り直して返すか(関数型)というだけの違いです「だけの違い」でなく、理論ではない指向、パラダイムとしてのオブジェクト指向にとってそこは大きな違いであり、その断面で分析すると「直交・独立な概念」ではありえない、と言うことだって簡単にできる。パラダイム、指向の対比において、「直交・独立な概念」などと相手が言い出したときは、其の人は単に論理的思考能力に劣るか、なんらかの誘導したい帰結に無自覚、其の両方か疑うべきでしょう。理論ではなく、パラダイム、指向の話で、他のパラダイムとの際をひたすら有耶無耶にっすることに努め、玉虫色を強調するほど愚かなことはありません。いうことが起こるのか?というと、そもそも、FPvsOPというのはよく知られた対立軸であり、周囲に波風を起こしたくない(特に和を尊しとする我々日本人には顕著)、穏当に、というバイアスと、論者の「保身」がある。割を食うのは常に真面目に勉強したいと思う学習者である。小中高、あるいは大学でそのような曖昧な説明しかしない愚かな教師にあたって迷惑を被った人も多いと思います。賢明な読者の方々は、ここで提供しているごく一部の情報にとどまらず、あくまでご自分の手で、国際的な情報、広い観点を検索して追認されることは可能ですし、その上で諸々の情報を比較検討して、どちらの情報がフェアで正しいのか?何か禍々しいものが国内の言論には存在しているのではないか?確認してみることができるでしょうし、ひたすら権威を振りかざして強弁するだけの横暴に組み敷かれたり、惑わされるのではなく、ご自分の手と頭を使って、正しい情報を確認されることを望みます。PS.オブジェクト指向と関数型は対立していますか?にて、>まさに「オブジェクト指向」と「命令型」を慎重に区別した上で、「オブジェクト指向言語と関数型言語」ではなく「命令型スタイルと関数型スタイル」を対比した、正確な記述だと思います。私の当記事の「メジャーなオブジェクト指向言語が命令型言語ベースのため」以下の部分もご参照ください。いう反応がありました。繰り返しになりますが、まず「オブジェクト指向」という言葉は、パラダイム、指向性を示すものであって理論ではありません。その上でより正確に「オブジェクト指向」という言葉について説明すると、これはそもそもアラン・ケイが提唱した概念です。http://d.hatena.ne.jp/sumim/20040525/p1というブログ記事が一般にわかりよくまとまっているので引用します。一般に「オブジェクト指向プログラミング」と呼ばれる考え方には発案者が異なる二系統がある。あった「クラス」という言語機能を使って実現(カプセル化、継承、多態性)するアイデアに基づく「抽象データ型のオブジェクト指向」。由来の言語機能を共に使用してはいるものの、考え方の方向性が全く異なっており本来きちんと区別すべきものである。もって「初のオブジェクト指向言語」としてしまうのは(ニガードやダールがまるで「オブジェクト指向」を考案したり「クラス」や「オブジェクト」をそのために設けたかのような)誤解や混乱を与える可能性があるので控えるべき。残念ながら、教科書的な記述の多くはこれら二つを書き手に都合のよい解釈でごちゃまぜにしてしまっており、しばしば学習者に対して無用な混乱を生じさせている。>一般に語られる「オブジェクト指向」はたいてい、この出自も文脈も目的も本質も異なる2つが、ただオブジェクト(あるいはクラス)という言語機能を共通に活用するというだけの理由でごっちゃにされて非常に合点のゆきにくいものになっています。教科書レベルの記述すら例外ではありません。ストラウストラップの主張への言及無しに「オブジェクト指向」を語ろうとする文章は、どんな偉い人、どんなに有名な人が書いていても(ノウハウとして役立つ内容であるかどうかはともかく、こと「オブジェクト指向」の紹介としては...)“眉唾もの”だと思って差し支えないと思っています。とあるように、正確には、オブジェクト指向というくくりのなかでさえ、2系統のパラダイムが存在します。オブジェクト指向と関数型は対立していますか?>(後者はいわゆるイミュータブルなオブジェクトとして広まりつつあるようです)。間違った情報が書かれているのですが、リンク先の英語版Wikipedia記事には正しい説明があります。「イミュータブルなオブジェクト」ImmutableObjectとは命令型プログラミングの文脈においても、パイその他の変更不能なConstant(定数)として知られている、とあるように、「広まる」も何もありません。オブジェクト指向、いかなるパラダイム、言語においても普遍的に我々が接する以前からある馴染みのある概念です。「後者」(副作用を用いない純粋関数型オブジェクト指向)が、一般的になりつつある、というように読者を誘導せんばかりの当該記述ですが、明確に間違っています。おいて、もっとも読者にとって重要な事柄は最後の総論部分です。ほとんどの開発者が命令型/手続き型スタイルのプログラミングに慣れています。純粋関数型スタイルの開発に移行するには、考え方を切り替えて、開発に適用する方法を変える必要があります。コントラクトの観点から考えます。何より重要なのはオブジェクト型の動作と状態であり、それに対処するために、クラス、インターフェイス、継承、ポリモーフィズムなどの言語機能が用意されています。つの課題として捉えます。関数型プログラミングでは、状態や変化するデータを避け、関数の適用を重視します。混乱した「オブジェクト指向」のあるかないかさえ不明な「理論」なるものによる分類は、プログラマーの誤解によるものなどではなく、そもそも「オブジェクト指向」というものがそういう漠然としたパラダイムである、ということにすぎず、現実上ほとんどのOOP開発者にとっては、対立するパラダイムとして頭を切り替える必要のある関数型スタイルが存在します。「副作用を用いない純粋関数型オブジェクト指向」ならば、それは単に「関数型プログラミング」です。枠組みがよくわからない、広く一般的には命令型として普及している「オブジェクト指向プログラミング」の一種だ、直交していると強調するのは誤りです。Posts量子コンピュータが超高速である原理と量子論とそれに至るまでの科学哲学史をゼロからわかりやすく解説01これは連載記事です。これは連載記事で、順次更新されます。この宇宙があらかじめ持っている計算能力に量子のレベルでアクセスして計算するマシン。都内の進学校に通っている。プログラミングが趣味でコンピュータ部に入部した。IQ145の知能を持つ美少女。セキヤの学校のコンピュータ部の先輩で、セキヤを厳しく指導する。