ここで関数型言語などについて多くの話をします。なぜあなたは「伝統的な」言語でそれを使うのですか?彼らは何をよりよくするのですか?彼らは何が悪いのですか?理想的な関数型プログラミングアプリケーションは何ですか?
ここで関数型言語などについて多くの話をします。なぜあなたは「伝統的な」言語でそれを使うのですか?彼らは何をよりよくするのですか?彼らは何が悪いのですか?理想的な関数型プログラミングアプリケーションは何ですか?
回答:
関数型言語は、命令型およびオブジェクト指向言語とは異なるパラダイムを使用します。これらは、言語の基本的なビルディングブロックとして副作用のない関数を使用します。これにより、多くのことが可能になり、多くのことがより困難になります(または、ほとんどの場合、人々が慣れているものとは異なります)。
関数型プログラミングの最大の利点の1つは、副作用のない関数の実行順序が重要ではないことです。たとえば、Erlangでは、これは非常に透過的な方法で並行性を有効にするために使用されます。また、関数型言語の関数は数学関数と非常によく似ているため、関数型言語に簡単に変換できます。これにより、コードが読みやすくなる場合があります。
従来、関数型プログラミングの大きな欠点の1つは、副作用がないことでもありました。IOなしで有用なソフトウェアを作成することは非常に困難ですが、IOを関数に副作用なしで実装することは困難です。そのため、ほとんどの人は、単一の入力から単一の出力を計算する以上に関数型プログラミングを使いこなすことはありません。F#やScalaなどの最新の混合パラダイム言語では、これはより簡単です。
現代の言語の多くは、関数型プログラミング言語の要素を持っています。C#3.0には多くの関数型プログラミング機能があり、Pythonでも関数型プログラミングを実行できます。関数型プログラミングの人気の理由は、主に次の2つの理由にあると思います。マルチプロセッサコンピューターがますます増えるため、通常のプログラミングでは同時実行性が実際の問題になりつつあります。そして言語はよりアクセスしやすくなっています。
「キャッチオン」プログラミングの関数型アプローチについては、40年もの間(プログラミングのスタイルとして)使用されているので、疑問の余地はないと思います。OOプログラマーが不変オブジェクトを支持するクリーンなコードを書くときはいつでも、そのコードは機能的な概念を借用しています。
ただし、関数型スタイルを強制する言語は、最近多くの仮想インクを取得しており、それらの言語が将来的に支配的になるかどうかは未解決の問題です。私自身の疑いは、ScalaやOCamlなどのハイブリッドのマルチパラダイム言語が 、純粋なOO言語(Smalltalk、Betaなど)がメインストリームプログラミングに影響を与えたが、終わらないのと同じ方法で、「純粋な」関数型言語よりも支配的になる可能性が高いことです。最も広く使用されている表記法として。
最後に、FPに関するコメントは、手続きプログラマーから何年も前に聞いたことのない発言と非常に類似していることを指摘しておきます。
グラフィカルユーザーインターフェイスと「ビジネスのモデルとしてのコード」がOOをより広く評価するのに役立つ概念であったのと同様に、不変性とシンプルな(大規模な)並列処理の使用の増加は、機能的アプローチが提供する利点をより多くのプログラマーが理解するのに役立つと思います。しかし、デジタルコンピュータープログラミングの歴史全体を構成する過去50年ほどの間に学んだことと同じくらい、私たちにはまだ学ぶべきことがたくさんあると思います。今から20年後、プログラマーは、現在人気のあるOO言語やFP言語など、現在使用しているツールの原始的な性質に驚きを振り返ります。
私にとっての主な利点は、特により多くのMHzから離れてより多くのコアに向かっている今、その固有の並列処理です。
私はそれが次のプログラミングパラダイムになり、OOタイプのメソッドを完全に置き換えるとは思わないが、関数型言語でコードの一部を記述する必要があるか、汎用言語がより機能的な構造を含むように成長します。
専門的に関数型言語で作業したことがなくても、関数型プログラミングを理解することで、より優れた開発者になります。それはあなたのコードとプログラミング一般に新しい視点を与えます。
私はそれを学ばない理由はないと言います。
関数型と命令型のスタイルをうまく組み合わせた言語が最も興味深く、成功する可能性が最も高いと思います。
私は常にネクストビッグシングに懐疑的です。多くの場合、Next Big Thingは歴史の偶然であり、テクノロジーが優れているかどうかに関係なく、適切な場所に適切なタイミングで存在します。例:C ++、Tcl / Tk、Perl。すべての欠陥のあるテクノロジーは、その日の問題を解決するか、または定着した標準とほぼ同じであるか、またはその両方であると認識されたため、すべて非常に成功しています。関数型プログラミングは確かに素晴らしいかもしれませんが、それが採用されるという意味ではありません。
しかし、私は人々が関数型プログラミングに興奮している理由をお伝えします。多くのプログラマーは、関数型言語を使用することで、生産中に2倍(またはおそらく10倍)生産性が高まるという一種の「変換経験」を経験しました。変更に対する耐性が高く、バグが少ないコード。これらの人々は、関数型プログラミングを秘密兵器と考えています。この考え方の良い例は、ポールグラハムのBeating the Averagesです。ああ、彼のアプリケーション?eコマースWebアプリ。
2006年の初めから、関数型プログラミングと並列処理についても話題になっています。Simon Peyton Jonesのような人々は少なくとも1984年以来、並列処理の心配を繰り返してきたので、関数型言語がマルチコアの問題を解決するまで、私は息を止めません。しかし、それは今のところ追加の話題のいくつかを説明しています。
一般に、アメリカの大学は関数型プログラミングを教える仕事をしている。Schemeを使用してイントロプログラミングを教えるための強力なサポートの中核があり、Haskellもそこでサポートを楽しんでいますが、関数型プログラマーに高度なテクニックを教える方法はほとんどありません。私はハーバードでそのようなコースを教えました、そして今春タフツで再びそうします。ベンジャミン・ピアスはペンでそのようなコースを教えてきました。ポール・フダックがイェール大学で何かをしたかどうか私は知りません。ヨーロッパの大学はずっと良い仕事をしています。たとえば、関数型プログラミングはデンマーク、オランダ、スウェーデン、英国の重要な場所で強調されています。オーストラレーシアで何が起こっているのか、私にはあまり意識がありません。
ここの部屋で象について言及している人はいないので、それは私次第だと思います:)
JavaScriptは関数型言語です。特にjQuery、Dojo、およびその他のフレームワークの細かい点を活用して、JSでより高度なことを行う人が増えるにつれて、FPはWeb開発者のバックドアによって導入されます。
クロージャーと組み合わせることで、FPはJSコードを本当に軽量にしますが、それでも読み取り可能です。
乾杯、PS
ほとんどのアプリケーションは、通常のオブジェクト指向の方法で解決できるほど単純です
オブジェクト指向の方法は、常に「正常」であるとは限りませんでした。この10年間の基準は、過去10年間に取り残された概念でした。
関数型プログラミングは数学です。LispのPaul Graham(Lispの代替関数型プログラミング):
したがって、この1950年代の言語が時代遅れではない理由を簡単に説明すると、それはテクノロジーではなく数学であり、数学は古くならないということです。Lispと比較する正しいことは1950年代のハードウェアではありませんが、たとえば、1960年に発見され、現在でも最速の汎用ソートであるQuicksortアルゴリズムです。
あなたが関数型プログラミングであることを知らなかったと思います:
平均的な企業のプログラマー、例えば私が一緒に働くほとんどの人はそれを理解しておらず、ほとんどの作業環境はあなたがそれをプログラムすることを許可していません
それは時間の問題です。あなたの平均的な企業のプログラマーは、現在のビッグシングが何であれ学習します。15年前、彼らはOOPを理解していませんでした。 IF FPは、あなたの「平均的な企業のプログラマは」続く、上のキャッチ。
大学で実際に教えられているわけではありません(または、最近ではそうですか)。
さまざまです。私の大学では、SMLは学生が紹介される最初の言語です。MITはLISPを1年目のコースとして教えていると思います。もちろん、これら2つの例は代表的なものではないかもしれませんが、ほとんどの大学では、FPに関するオプションのコースを提供しています。
ほとんどのアプリケーションは、通常のオブジェクト指向の方法で解決できるほど単純です
しかし、それは実際には「十分に単純」の問題ではありません。ソリューションはFP でよりシンプル(またはより読みやすく、堅牢でエレガント、高性能)になりますか?多くのことは「Javaで解決するのに十分単純」ですが、それでもなお膨大な量のコードが必要です。
いずれにせよ、FPの支持者たちは、これが数十年前から次の大物であると主張していることを覚えておいてください。おそらく正しいのかもしれませんが、5、10、または15年前に同じ主張をしたときはそうではなかったことに留意してください。
しかし、C#が最近注目している点の1つは、最近では、気づかれることなく、世代のプログラマーをFPプログラマーに実質的に変えようとしているという点で、FPに向けて急激に変化していることです。それはFPの「革命」への道を開くかもしれない。多分。;)
関数型言語の重要な特徴の1つは、ファーストクラスの関数の概念です。考え方としては、関数をパラメーターとして他の関数に渡し、それらを値として返すことができます。
関数型プログラミングでは、状態を変更しないコードを記述します。これを行う主な理由は、関数を連続して呼び出しても同じ結果が得られるようにするためです。関数型コードは、ファーストクラスの関数をサポートする任意の言語で作成できますが、Haskellのように、状態を変更できない言語もあります。実際、副作用(テキストの印刷など)を行う必要はまったくありません。まったく役に立たないように思えます。
Haskellは代わりにIOへの別のアプローチを採用しています:モナド。これらは、インタプリタのトップレベルによって実行される必要なIO操作を含むオブジェクトです。その他のレベルでは、それらはシステム内の単なるオブジェクトです。
関数型プログラミングにはどのような利点がありますか?関数型プログラミングでは、各コンポーネントが完全に分離されているため、バグの可能性が少ないコーディングが可能です。また、再帰関数とファーストクラスの関数を使用すると、コードの構造を通常反映する正確さの簡単な証明が可能になります。
私は、関数型プログラミングが(OOのような主要なパラダイムになる)とは思えない、最も現実的な人々は考えていないと思います。結局のところ、ほとんどのビジネスの問題はかなり数学の問題ではなく、データを移動してさまざまな方法で表示するための非常に重要なルールです。つまり、純粋な関数型プログラミングパラダイムには適していません(モナドの学習曲線はオブジェクト指向をはるかに超えています)。
OTOH、関数型プログラミングはプログラミングを楽しくするものです。宇宙の根底にある数学の簡潔な表現の本質的で時代を超越した美しさを認めてくれます。人々は関数型プログラミングを学ぶことはあなたをより良いプログラマーにするだろうと言っています。これはもちろん非常に主観的です。個人的にはそれも完全に正しいとは思いません。
それはあなたをより良い知性のある存在にします。
私は密であるにちがいありませんが、それでもまだわかりません。F#などの関数型言語で記述された小さなアプリの実際の例はありますか?ソースコードを見て、そのようなアプローチを使用する方が、たとえばC#よりも優れている理由と方法を確認できますか?
関数型言語についてあなたが言ったすべてのことを指摘しますが、ほとんどの人は約20年前にオブジェクト指向言語について言っていました。その当時、OOについて聞くのは非常に一般的でした。
* The average corporate programmer, e.g. most of the people I work with, will not understand it and most work environments will not let you program in it
* It's not really taught at universities (or is it nowadays?)
* Most applications are simple enough to be solved in normal IMPERATIVE ways
変化はどこかから来る必要があります。以前のテクノロジーで訓練を受けた人々が、変更は不要であるとの見方をするかどうかに関係なく、意味のある重要な変更が行われます。OOへの変更は当時反対していたすべての人々にもかかわらず良いと思いますか?
F#は、Microsoftが推進しているため、追いつくことができます。
プロ:
反対:
それで、私はF#が重要になるために50:50のチャンスを与えます。他の関数型言語は近い将来には実現しないでしょう。
言語が受け入れられるかどうかの最も重要な部分は、その言語がどれほど優れているかだと感じる人もいるためだと思います。残念ながら、物事がそれほど単純なことはめったにありません。たとえば、私は、Pythonの受け入れの背後にある最大の要因は言語自体ではないことを主張します(それはかなり重要ですが)。Pythonが非常に人気がある最大の理由は、その巨大な標準ライブラリとサードパーティライブラリのさらに大きなコミュニティです。
ClojureやF#などの言語は、JVM / CLRに基づいて構築されていることを考えると、このルールの例外となる場合があります。結果として、私には彼らに対する答えがありません。
LispやSchemeを学部生として学んだことのない人々が、今ではそれを発見しているように思えます。この分野の多くのことと同様に、誇大宣伝を行い、高い期待を生み出す傾向があります...
合格します。
関数型プログラミングは素晴らしいです。しかし、それは世界を引き継ぐことはありません。C、C ++、Java、C#などはまだ存在します。
これから来るのは、言語を超えた能力だと思います。たとえば、関数型言語で物事を実装し、他の言語でそのものにアクセスできるようにするなどです。
Epic GamesのTim Sweeneyによる「次の主流のプログラミング言語:ゲーム開発者の展望」を読んだとき、最初に思ったのは、Haskellを学ぶことでした。
最近、プログラミング言語の進化を追っていますか?すべての主流のプログラミング言語のすべての新しいリリースは、関数型プログラミングからますます多くの機能を借りているようです。
クロージャー、無名関数、値としての関数の受け渡しと戻りは、LispとMLハッカーだけが知っているエキゾチックな機能でした。しかし徐々に、C#、Delphi、Python、Perl、Javascriptがクロージャーのサポートを追加しました。将来の言語が閉鎖なしで真剣に受け取られることは不可能です。
いくつかの言語、特にPython、C#、Rubyは、リスト内包表記とリストジェネレーターをネイティブでサポートしています。
MLは1973年にジェネリックプログラミングを開拓しましたが、ジェネリックのサポート(「パラメトリックポリモーフィズム」)は、過去5年ほどで業界標準になりました。私の記憶が正しければ、Fortranは2003年にジェネリックをサポートし、続いてJava 2004、C#は2005年、Delphiは2008年にサポートしました。 。)
これらの機能がプログラマにとって魅力的な理由は何ですか?それは明らかに明白であるべきです:それはプログラマーがより短いコードを書くのを助けます。将来のすべての言語は、競争力を維持したい場合、少なくともクロージャをサポートする予定です。この点で、関数型プログラミングはすでに主流になっています。
ほとんどのアプリケーションは、通常のオブジェクト指向の方法で解決できるほど単純です
単純なものにも関数型プログラミングを使用できないと誰が言うのですか?すべての関数型プログラムがコンパイラ、定理証明器、または超並列通信スイッチである必要はありません。より複雑なプロジェクトに加えて、アドホックな使い捨てスクリプトにF#を定期的に使用しています。
これは、複雑さを制御するための最良のツールであるため、普及しています。参照:
-Simon Peyton-Jonesのスライド109から116が「A Taste of Haskell」を語る
-「次の主流のプログラミング言語:ゲーム開発者の視点」by Tim Sweeney
チェックアウトはなぜ関数型プログラミング事項
最初の点には同意しますが、時代は変わります。企業は、たとえ採用が遅れていても、有利な点があると判断すれば対応します。人生はダイナミックです。
彼らは90年代後半にスタンフォード大学でHaskellとMLを教えていました。カーネギーメロン、MIT、スタンフォード、その他の優れた学校のような場所が生徒にそれを提示していると確信しています。
ほとんどの「Web上のリレーショナルデータベースを公開する」アプリは、その流れの中で長く続くことに同意します。Java EE、.NET、RoR、およびPHPは、その問題に対するかなり優れたソリューションを進化させてきました。
重要な何かにぶつかりました:関数型プログラミングを後押しする他の方法では簡単に解決できない問題である可能性があります。それは何でしょうか?
大規模なマルチコアハードウェアとクラウドコンピューティングはそれらを推進しますか?
FPには生産性、信頼性、保守性の面で大きなメリットがあるためです。メニーコアは、大量のレガシーコードにもかかわらず、大企業が最終的に切り替えを行うキラーアプリである可能性があります。同時実行性や並列処理には適していません。
「通常の」プログラマーが理解できないことに同意しません。彼らは、最終的にOOPを理解したのと同じように(これは、不可解で奇妙なことですが、そうでない場合も同様です)。
また、ほとんどの大学がFPを教えています。多くの大学がFPを最初のプログラミングコースとして教えています。
うまくいくかどうかはわかりませんが、私の調査によると、関数型言語はほぼ間違いなく学ぶ価値があり、より優れたプログラマーになります。参照の透明性を理解するだけで、多くの設計上の決定が非常に簡単になり、結果として得られるプログラムの推論がはるかに容易になります。基本的に、問題が発生した場合、何百ものクラス/メソッド/関数によって引き起こされた可能性のある、一貫性のない状態の問題ではなく、単一の関数の出力のみの問題になる傾向があります。副作用のある命令型の言語で。
FPのステートレスな性質は、Webのステートレスな性質により自然に対応するため、関数型言語は、よりエレガントでRESTFULなWebアプリケーションに簡単に対応できます。アプリケーションの状態を維持するためにVIEWSTATEやSESSIONキーのようなひどく醜いハックに頼る必要があるJAVAや.NETフレームワークとは対照的です。
また、アプリケーションがステートレスになるほど、並列処理が容易になります。あなたのウェブサイトがたまたま人気になった場合、ウェブにとって非常に重要です。パフォーマンスを向上させるためにサイトにハードウェアを追加するだけでは、必ずしも簡単ではありません。
他の答えに加えて、純粋な関数の形でソリューションをキャストすると、問題をよりよく理解するように強制されます。逆に、機能的なスタイルで考えると、問題解決能力が向上します*。
*機能的パラダイムの方が優れているため、または追加の迎え角が得られるためです。