質問

ここでは関数型言語などについて多くの議論が行われています。なぜ「伝統的な」言語ではなくその言語を使用するのでしょうか?彼らの何がより優れているのでしょうか?彼らは何が苦手なのでしょうか?理想的な関数型プログラミング アプリケーションとは何ですか?

役に立ちましたか?

解決

関数型言語は、命令型言語やオブジェクト指向言語とは異なるパラダイムを使用します。これらは、言語の基本的な構成要素として副作用のない関数を使用します。これにより、多くのことが可能になりますが、多くのことが困難になります (または、ほとんどの場合、人々が慣れ親しんでいるものとは異なります)。

関数型プログラミングの最大の利点の 1 つは、副作用のない関数の実行順序が重要ではないことです。たとえば、Erlang では、これは非常に透過的な方法で同時実行を有効にするために使用されます。また、関数型言語の関数は数学関数と非常によく似た動作をするため、関数型言語に変換するのは簡単です。場合によっては、これによりコードが読みやすくなることがあります。

従来、関数型プログラミングの大きな欠点の 1 つは、副作用がないことでもありました。IO なしで有用なソフトウェアを書くのは非常に困難ですが、関数に副作用を与えずに IO を実装するのは困難です。したがって、ほとんどの人は、単一の入力から単一の出力を計算すること以上に関数型プログラミングから得たものはありません。F# や Scala などの最新の混合パラダイム言語では、これは簡単です。

最新の言語の多くには、関数型プログラミング言語の要素が含まれています。C# 3.0 には多くの関数型プログラミング機能があり、Python でも関数型プログラミングを行うことができます。関数型プログラミングの人気の理由は主に 2 つあると思います。マルチプロセッサ コンピュータがますます増えているため、通常のプログラミングでは同時実行性が大きな問題になりつつあります。そして言語はよりアクセスしやすくなっています。

他のヒント

プログラミングへの関数型アプローチが「普及している」ことに疑問の余地はないと思います。なぜなら、関数型アプローチは (プログラミングのスタイルとして) 約 40 年間使用されてきたからです。オブジェクト指向プログラマが不変オブジェクトを優先するクリーンなコードを作成するときは常に、そのコードは機能概念を借用しています。

ただし、 強制する 最近は関数型スタイルが仮想インクとして多く使われていますが、これらの言語が将来的に主流になるかどうかは未解決の問題です。私自身の疑念は、次のようなハイブリッドでマルチパラダイムの言語ではないかということです。 スカラ座 または OCaml純粋な OO 言語 (Smalltalk、Beta など) が主流のプログラミングに影響を与えたものの、最も広く使用される表記法にはならなかったのと同じように、「純粋主義」の関数型言語よりも優勢になる可能性があります。

最後に、FP に関するあなたのコメントは、それほど数年前に私が手続き型プログラマから聞いた発言と非常に類似していることを指摘せずにはいられません。

  • (神話的ですが、私見ですが)「平均的な」プログラマーはそれを理解していません。
  • あまり広く教えられていません。
  • これを使用して作成できるプログラムはすべて、現在の技術を使用して別の方法で作成できます。

グラフィカル ユーザー インターフェイスと「ビジネスのモデルとしてのコード」が、OO がより広く評価されるようになった概念であるのと同じように、不変性とより単純な (大規模な) 並列処理の使用が増えることで、関数型アプローチが提供する利点をより多くのプログラマーが認識できるようになると私は信じています。 。しかし、私たちがこれまでに学んだ限り、 過去50年ほど これらはデジタル コンピューター プログラミングの歴史全体を構成していますが、私たちはまだ学ぶべきことがたくさんあると思います。今から 20 年後、プログラマーは、私たちが現在使用しているツールの原始的な性質を驚きながら振り返るでしょう。 含む 現在人気の OO 言語と FP 言語。

私にとっての主な利点は、特に現在、より多くの MHz からより多くのコアに移行しているため、その固有の並列性です。

それが次のプログラミング パラダイムになり、OO タイプのメソッドを完全に置き換えるとは思いませんが、コードの一部を関数型言語で記述するか、汎用言語で記述する必要があるという点には到達すると思います。より機能的な構造を含むように成長します。

関数型言語を専門的に扱ったことがない場合でも、関数型プログラミングを理解すれば、より優れた開発者になれます。これにより、コードとプログラミング全般について新しい視点が得られます。

それを学ばない理由はない、と私は言います。

私は、関数型と命令型のスタイルを上手に組み合わせている言語が最も興味深く、成功する可能性が最も高いと考えています。

私は次の大きな出来事については常に懐疑的です。多くの場合、次の大きな出来事は単なる歴史の偶然であり、テクノロジーが優れているかどうかに関係なく、適切なタイミングで適切な場所に存在します。例:C++、Tcl/Tk、Perl。すべて欠陥のあるテクノロジーであり、大成功を収めたのは、当時の問題を解決するか、定着した標準とほぼ同一であるか、あるいはその両方であると認識されていたためです。関数型プログラミングは確かに素晴らしいかもしれませんが、それが採用されるという意味ではありません。

しかし、私 できる なぜ人はそうなのか教えてください 興奮した 関数型プログラミングについて:非常に多くのプログラマーは、関数型言語を使用すると生産性が 2 倍 (またはおそらく 10 倍) になり、同時に変更に対する耐性が高く、バグが少ないコードを生成できることを発見する、一種の「変換経験」を経験したことがあります。これらの人々は、関数型プログラミングを秘密兵器として考えています。この考え方の良い例は、ポール・グレアムの考えです。 平均を上回る. 。ああ、それで彼の申請書は?電子商取引 Web アプリ。

2006 年の初めから、関数型プログラミングと並列処理についても話題になりました。人々が好きなので、 サイモン・ペイトン・ジョーンズ 私は少なくとも 1984 年以来、並列処理について断続的に心配してきました。関数型言語がマルチコアの問題を解決するまで、私は息をひそめるつもりはありません。しかし、それは現時点での追加の話題のいくつかを説明しています。

一般に、アメリカの大学は関数型プログラミングの教育がうまくいっていません。強力な支持層がいる Scheme を使用した入門プログラミングの指導, Haskell もそこである程度のサポートを受けていますが、関数型プログラマーに高度なテクニックを教える方法はほとんどありません。私はハーバード大学でこのようなコースを教えたことがあるが、この春タフツでも再び教える予定である。ベンジャミン・ピアースはペンシルバニア大学でそのようなコースを教えました。ポール・ハダックがイェール大学で何かをしたかどうかは知りません。ヨーロッパの大学ははるかに良い仕事をしています。たとえば、関数型プログラミングは、デンマーク、オランダ、スウェーデン、英国の重要な場所で重視されています。オーストラリアで何が起こっているのか、私にはあまり分かりません。

ここの部屋の象について言及している人は誰もいないので、それは私次第だと思います:)

JavaScript は関数型言語です。特に jQuery、Dojo、その他のフレームワークの優れた点を活用して、JS でより高度な作業を行う人が増えるにつれて、Web 開発者のバックドアによって FP が導入されることになります。

FP はクロージャと連携して、JS コードを非常に軽くしながらも読みやすいものにします。

乾杯、ps

ほとんどのアプリケーションは、通常のオブジェクト指向の方法で解決できるほど単純です

  1. OOの方法は常に「正常」ではありません。この10年の基準は、過去10年間の疎外された概念でした。

  2. 関数型プログラミングは数学です。 Lisp についてのポール・グレアム (Lisp の代わりに関数型プログラミング):

したがって、この1950年代の言語が時代遅れではない理由の簡単な説明は、それはテクノロジーではなく数学であり、数学は古くなっていないということです。LISPと比較するのが正しいのは、1950年代のハードウェアではなく、たとえば、1960年に発見され、依然として最速の汎用ソートです。

以下を使用したとき、関数型プログラミングであることを知らなかったに違いありません。

  • Excelの数式
  • クォーツコンポーザー
  • JavaScript
  • ロゴ(カメのグラフィック)
  • リンク
  • SQL
  • underscore.js(またはlodash)、d3

平均的な企業プログラマー、たとえば、私が一緒に仕事をしている人のほとんどはそれを理解しておらず、ほとんどの職場環境はあなたにプログラムをさせません

ただし、それも時間の問題です。平均的な企業プログラマーは、現在の大きな出来事が何であれ学習します。15 年前、彼らは OOP を理解していませんでした。もし FP が普及すれば、「平均的な企業プログラマ」も追随するでしょう。

それは大学で実際に教えられていません(または最近ですか?)

大きく異なります。私の大学では、SML は学生が最初に学ぶ言語です。MIT では LISP を初年度コースとして教えていると思います。もちろん、これら 2 つの例は代表的なものではないかもしれませんが、ほとんどの大学では、カリキュラムの必須部分としていないとしても、少なくとも FP に関するオプションのコースをいくつか提供していると思います。

ほとんどのアプリケーションは、通常のOOの方法で解決するのに十分なシンプルです

ただし、実際には「十分にシンプル」というわけではありません。解決策はあるだろうか より単純な (またはより読みやすく、堅牢で、エレガントで、パフォーマンスが高い) FP ですか?多くのことは「Java で解決できるほど単純」ですが、それでも恐ろしい量のコードが必要です。

いずれにせよ、FP の支持者たちは数十年にわたり、FP が次のビッグシングであると主張してきたことを心に留めておいてください。おそらく彼らは正しいのですが、5年、10年、15年前に同じ主張をしたときはそうではなかったということを覚えておいてください。

しかし、間違いなく彼らに有利な点が 1 つあります。それは、最近 C# が FP に向けて急激に方向転換しており、事実上、ある世代のプログラマーが FP プログラマーに変わっているということです。 彼らが気付かないうちに. 。それはFPの「革命」への道を開くかもしれない。多分。;)

他の芸術の価値が分からなければ、人間は自分が選んだ芸術の完璧と不完全さを理解することはできません。ルールに従うことは、ある時点までのテクニックの開発のみを許可し、その後、学生とアーティストはさらに学び、さらに先を追求する必要があります。戦略だけでなく他の芸術も学ぶのは理にかなっています。

他の人の活動を見て、自分自身について何かを学んだことがない人はいないでしょうか。剣を学ぶにはギターを学ぶ。まずは商業を勉強してください。剣を学ぶだけでは心が狭くなり、外への成長はできません。

-- 宮本武蔵『五輪書』

関数型言語の重要な機能の 1 つは、ファーストクラス関数の概念です。その考え方は、関数をパラメーターとして他の関数に渡し、それらを値として返すことができるということです。

関数型プログラミングには、状態を変更しないコードを記述することが含まれます。そうする主な理由は、関数を連続して呼び出しても同じ結果が得られるようにするためです。関数コードは、ファーストクラス関数をサポートする任意の言語で作成できますが、Haskell など、状態を変更できない言語もあります。実際、副作用 (テキストの出力など) をまったく行うべきではありません。まったく役に立たないように思えます。

Haskell は代わりに、IO に対して別のアプローチを採用しています。モナド。これらは、インタープリタのトップレベルによって実行される必要な IO 操作を含むオブジェクトです。他のレベルでは、それらはシステム内の単なるオブジェクトです。

関数型プログラミングにはどのような利点がありますか?関数型プログラミングでは、各コンポーネントが完全に分離されているため、バグの可能性が少ないコーディングが可能になります。また、再帰関数とファーストクラス関数を使用すると、通常はコードの構造を反映した単純な正しさの証明が可能になります。

現実的な人のほとんどは、関数型プログラミングが普及する (OO のような主要なパラダイムになる) とは考えていないと思います。結局のところ、ほとんどのビジネス上の問題は、きれいな数学の問題ではなく、データを移動し、さまざまな方法で表示するための毛深い命令規則です。これは、純粋な関数型プログラミングのパラダイムには適していないことを意味します (モナドの学習曲線は 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 への変更は良かったと思いますか?

Microsoft が F# を推進しているため、F# が普及する可能性があります。

プロ:

  • F# は Visual Studio の次のバージョンの一部になる予定です
  • Microsoft は、エバンジェリスト、書籍、著名な顧客と協力するコンサルタント、MS カンファレンスでの重要な露出など、コミュニティを構築しているところです。
  • F# は一流の .Net 言語であり、非常に大きな基盤を備えた最初の関数型言語です (Lisp、Haskell、Erlang、Scala、OCaml に多くのライブラリがないと言っているわけではありません。単に .Net ほど完全ではないだけです)は)
  • 並列処理の強力なサポート

逆:

  • C# と .Net に慣れていても、F# を始めるのは非常に困難です - 少なくとも私にとっては :(
  • 優れた F# 開発者を見つけるのはおそらく難しいでしょう

したがって、私は F# が重要になるチャンスを 50:50 に与えます。他の関数型言語は近い将来には実現しないでしょう。

一つの理由はそれだと思います ある言語が受け入れられるかどうかで最も重要なのは、その言語がどれだけ優れているかであると感じる人もいます。. 。残念ながら、物事がこれほど単純になることはめったにありません。たとえば、Python が受け入れられた最大の要因は言語そのものではないと私は主張します (ただし、 かなり重要です)。Python が非常に人気がある最大の理由は、その巨大な標準ライブラリと、さらに大きなサードパーティ ライブラリのコミュニティです。

Clojure や F# などの言語は、JVM/CLR 上に構築されていることを考慮すると、このルールの例外となる可能性があります。結果として、私は彼らに対して答えを持っていません。

ほとんどのアプリケーションは [好みの言語、パラダイムなどを挿入する] で解決できます。ここ]。

これは事実ですが、さまざまな問題を解決するためにさまざまなツールを使用できます。Functional は、正しく使用された場合に、より効率的に仕事を行うことを可能にする、別の高い (より高い?) レベルの抽象化を可能にします。

学部時代に Lisp や Scheme を学んだことがなかった人たちが、今では Lisp や Scheme を発見しつつあるように思えます。この分野の多くのことと同様に、誇大広告や高い期待を生み出す傾向があります...

それは通ります。

関数型プログラミングは素晴らしいです。ただし、世界を征服することはできません。C、C++、Java、C# などは今後も存在します。

これにより、より多くの言語を横断する能力が得られると思います。たとえば、関数型言語で実装し、他の言語でその要素にアクセスできるようにするなどです。

「次の主流のプログラミング言語」を読むとき:「ゲーム開発者の視点」 (Epic Games 社、Tim Sweeney 著) を読んで最初に思ったのは、Haskell を学ばなければならないということでした。

パワーポイント

GoogleのHTMLバージョン

しばらくの間、物事は機能的な方向に進んでいます。ここ数年で登場した 2 つのクールな新人、Ruby と Python はどちらも、以前のものよりも根本的に関数型言語に近づいています。そのため、一部の Lisper はどちらかを「十分に近い」ものとしてサポートし始めています。

そして、超並列ハードウェアがすべての人に進化のプレッシャーを与えており、関数型言語がその変化に対処するのに最適な場所にあることから、Haskell や F# が次の大きなものになると考えるのは、かつてほどの飛躍ではありません。

最近、プログラミング言語の進化を追っていますか?すべての主流プログラミング言語の新しいリリースは、関数型プログラミングからますます多くの機能を借用しているようです。

  • クロージャ、匿名関数、値として関数を渡したり返したりすることは、かつては Lisp と ML ハッカーだけが知っている珍しい機能でした。しかし、徐々に、C#、Delphi、Python、Perl、JavaScript にクロージャーのサポートが追加されました。どのような新進気鋭の言語も、クロージャなしでは真剣に受け止めることは不可能です。

  • いくつかの言語、特に Python、C#、Ruby では、リスト内包表記とリスト ジェネレーターがネイティブでサポートされています。

  • ML は 1973 年にジェネリック プログラミングの先駆者となりましたが、ジェネリック (「パラメトリック多態性」) のサポートが業界標準になったのはここ 5 年ほどです。私の記憶が正しければ、Fortran がジェネリックスをサポートしたのは 2003 年で、続いて Java 2004、C# が 2005 年、Delphi が 2008 年にサポートされました。(C++ が 1979 年からテンプレートをサポートしていることは知っていますが、C++ の STL に関する議論の 90% は「ここに悪魔がいる」ということから始まります。)

これらの機能がプログラマーにとって魅力的なのはなぜでしょうか?それは明白なはずです: プログラマーがより短いコードを書くのに役立ちます. 。将来的にすべての言語は、競争力を維持したい場合、少なくともクロージャをサポートする予定です。この点では、関数型プログラミングはすでに主流になっています。

ほとんどのアプリケーションは、通常のOOの方法で解決するのに十分なシンプルです

単純なものにも関数型プログラミングを使用できないと誰が言ったでしょうか?すべての関数型プログラムがコンパイラ、定理証明器、または超並列通信スイッチである必要はありません。私は、より複雑なプロジェクトに加えて、アドホックな使い捨てスクリプトにも F# を定期的に使用しています。

複雑さを制御するための最良のツールであるため、人気が高まっています。見る:
- Simon Peyton-Jones 講演「A Taste of Haskell」のスライド 109 ~ 116
- 「次の主流のプログラミング言語:ゲーム開発者の視点」ティム・スウィーニー著

最初の点には同意しますが、時代は変わります。たとえ後発であっても、メリットがあると判断すれば、企業は応じるでしょう。人生はダイナミックです。

彼らは 90 年代後半にスタンフォードで Haskell と ML を教えていました。カーネギーメロン大学、MIT、スタンフォード大学、その他の優れた学校が学生にそれを提供していると確信しています。

私は、ほとんどの「リレーショナル データベースを Web 上に公開する」アプリが今後もその流れを長期間続けるだろうということに同意します。Java EE、.NET、RoR、および PHP は、この問題に対するいくつかの非常に優れたソリューションを進化させてきました。

重要なことを思いつきました:関数型プログラミングを後押しするのは、他の手段では簡単に解決できない問題かもしれません。それは何でしょうか?

大規模なマルチコア ハードウェアとクラウド コンピューティングがそれらを推進するでしょうか?

なぜなら、FP には生産性、信頼性、保守性の点で大きなメリットがあるからです。メニーコアは、大量のレガシー コードにもかかわらず、最終的に大企業に切り替えを促すキラー アプリになる可能性があります。さらに、C# のような大手商用言語でさえ、メニーコアに関する懸念の結果として、独特の関数的風味を帯びています - 単なる副作用です。同時実行性や並列性とはうまく適合しません。

「普通の」プログラマがそれを理解できないという意見には私は同意しません。彼らは、最終的に OOP を理解したのと同じように (OOP は、それ以上ではないにしても、同じくらい神秘的で奇妙です) 理解するでしょう。

また、ほとんどの大学ではFPを教えており、最初のプログラミングコースとしてFPを教えている大学も少なくありません。

うわー、これは興味深い議論ですね。これについての私自身の考えは次のとおりです。

FP を使用すると、一部のタスクが (FP 以外の言語と比較して) 比較的簡単になります。非 FP 言語はすでに FP からアイデアを取り入れ始めているため、この傾向は今後も続き、人々が FP への飛躍を容易にするためのマージがさらに行われるのではないかと思います。

普及するかどうかはわかりませんが、私の調査によると、関数型言語はほぼ確実に学ぶ価値があり、より優れたプログラマーになれるでしょう。参照透過性を理解するだけで、多くの設計上の決定が非常に簡単になり、結果として得られるプログラムの推論がはるかに容易になります。基本的に、問題が発生した場合、それは数百のクラス/メソッド/関数のいずれかが原因である可能性のある、一貫性のない状態に関する問題ではなく、単一の関数の出力に関する問題であることが多いです。副次的な副作用を伴うたとえ言葉で。

FP のステートレスな性質は、Web のステートレスな性質により自然に対応するため、関数型言語はよりエレガントで RESTFUL Web アプリに適しています。Web のような本質的にステートレスな機能プラットフォーム上で、アプリケーションの状態を維持したり、ステートフル命令型言語の (場合によっては非常に漏洩の多い) 抽象化を維持したりするために、VIEWSTATE キーや SESSION キーなどのひどく醜い HACK に頼る必要がある JAVA や .NET フレームワークと対照してください。

また、アプリケーションがステートレスであればあるほど、並列処理が容易になります。あなたの Web サイトがたまたま人気を得た場合、Web にとって非常に重要です。パフォーマンスを向上させるためにサイトにハードウェアを追加するだけでは、必ずしも簡単なわけではありません。

私の見解では、Microsoft がそれを主流に押し上げた今、それは普及するだろうということです。私にとって、それが私たちにできること、新しい挑戦であること、そして将来に向けての雇用の機会があることから、それは魅力的です。

一度マスターすれば、プログラマーとしての生産性をさらに高めるのに役立つもう 1 つのツールになります。

この議論で見落とされていた点は、最適な型システムは現代の FP 言語にあるということです。さらに、コンパイラはすべて (または少なくともほとんど) の型を自動的に推論できます。

興味深いのは、Java をプログラミングするときに型名の記述に半分の時間をかけているにもかかわらず、Java ははるかにタイプセーフではないということです。Haskell プログラムで型を書くことは決してないかもしれませんが (コンパイラ チェックされたドキュメントの一種を除いて)、コードは 100% 型安全です。

他の答えに加えて、純粋な関数の用語で解決策をキャストすると、問題をより深く理解することができます。逆に、関数型スタイルで考えると、より優れた*問題解決スキルが開発されます。

*機能的パラダイムがより優れているため、または追加の攻撃角度が得られるためです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top