視野を広げるために関数型言語を学びたいです。私はPythonとC/C ++の知識があり、言語の命令型ドメインから来た人から言語を簡単に習得できるようにしたいと思っています。言語が十分に強力であるかどうかは気にしません。関数型プログラミングの基礎を学ぶための言語が欲しいだけです。それから、もっと難しい(そして強力な言語)を試してみます。
ありがとう
視野を広げるために関数型言語を学びたいです。私はPythonとC/C ++の知識があり、言語の命令型ドメインから来た人から言語を簡単に習得できるようにしたいと思っています。言語が十分に強力であるかどうかは気にしません。関数型プログラミングの基礎を学ぶための言語が欲しいだけです。それから、もっと難しい(そして強力な言語)を試してみます。
ありがとう
私はこれらの教育的目的のために純粋な言語をお勧めします。それはまた十分に強力です。より人気のある/より多くのコミュニティサポートが必要な場合は、最初に不慣れな構文(Schemeを使用)または不慣れなタイピング(OCamlを使用)のどちらを処理するかに応じて、SchemeまたはOCamlをお勧めします。SMLとF#はOCamlとわずかに異なります。他の人は、Clojure、Scala、Haskellについて言及している、または言及する予定です。
ClojureはSchemeの変形であり、独自の特異性(末尾呼び出しの最適化がないなど)があるため、Clojureを使用することでSchemeから始めることができます。ただし、特異性の低いスキームの実装を使用すると、より簡単な時間を過ごせると思います。ラケットは、教えるためによく使われるものです。Scalaは基本的にOCamlに似ているように見えますが、これはカジュアルな親しみやすさにのみ基づいています。
Haskellとは異なり、言及されている他の言語にはすべて2つの利点があります。(1)評価順序はデフォルトで熱心ですが、具体的に要求することで遅延評価を取得できます。Haskellの逆です。(2)ミューテーションは利用可能ですが、表示されるライブラリやコードの多くはミューテーションを使用していません。実際、関数型プログラミングを学びながら、それが副作用とどのように相互作用するかを見て、少し先のモナディックスタイルの作曲に取り組む方が教育学的に優れていると思います。ですから、これは利点だと思います。ただし、Haskellのより隔離されたミュータトンの処理に最初に投入する方がよいと言う人もいます。
CMUのRobertHarperには、関数型プログラミングの指導に関するすばらしいブログ投稿がいくつかあります。私が理解しているように、彼は教育のためにOCamlのような言語も好みます。
私が推奨した3つのクラスの言語(Pure、Schemeとその仲間、OCamlとその仲間)のうち、最初の2つは動的型付けを持っています。1番目と3番目には明示的な参照セルがあります(Pythonの場合と同様に、変数を再割り当てしないように制限しましたが、リストインデックスに格納されているものを変更することはできます)。スキームには暗黙の参照セルがあります。CやPythonのように、変数自体は変更可能に見え、参照セルの処理は内部で行われます。そのような言語では、明示的な参照セルの形式も利用できることがよくあります(Pythonで示した例のように、またはRacketで可変ペア/リストを使用しています... Scheme標準を含む他のSchemeでは、これらはデフォルトのペア/リスト)。
Haskellが持っている1つの美徳は、いくつかの教科書がそのために登場していることです。(私はこれを誠実に、ひそかにではなく意味します。)どの本/リソースを使用するかは、多くの戦争/クローズド質問を伴う別の物議を醸す問題です。他の人が推奨しているように、SICPには多くのファンと批評家がいます。私には多くの良い選択があるように思われます。私はそれらの議論にこれ以上踏み込むつもりはありません。
最初に、コンピュータプログラムの構造と実装を読んでください。私は、最初の関数型プログラミング言語としてLisp(たとえば、方言スキーム)をお勧めします。
もう1つのオプションはClojureです。これは、Scheme / Racketよりも「純粋に」機能的であり(ここで詳細については聞かないでください)、SICP(Structure and Interpretation)と組み合わせて使用できるほど類似している可能性があります。コンピュータプログラムの、また別の答えによって提案された強くお勧めの本)。
視野を広げるために関数型言語を学びたいです。私はPythonとC/C ++の知識があり、言語の命令型ドメインから来た人から言語を簡単に習得できるようにしたいと思っています。言語が十分に強力であるかどうかは気にしません。関数型プログラミングの基礎を学ぶための言語が欲しいだけです。それから、もっと難しい(そして強力な言語)を試してみます。
素晴らしい質問です!
1990年代後半に関数型プログラミングを始める前は、BASIC、Pascal、アセンブラー、C、C++を実行していました。それから私はほぼ同時に2つの関数型言語であるMathematicaとOCamlを使い始め、数年以内にそれらを独占的に使用していました。特に、OCamlでは、以前に書いていたコードのように見える命令型コードを書くことができました。MLの利点を明らかにするさまざまなアプローチを比較できるため、学習者として価値があることがわかりました。
しかし、他の人が述べているように、MathematicaとOCamlの主な利点はパターンマッチングであり、それは関数型プログラミングとは技術的には関係ありません。その後、他の多くの関数型言語を調べましたが、パターンマッチングのない言語に戻ることは望んでいません。
この質問は、終わりのない言語戦争を引き起こすため、おそらくトピックから外れていますが、ここに一般的なアドバイスがあります。
関数型プログラミング言語には、「ほとんど機能的」と呼ばれることもあるクラスがあり、必要な場所でいくつかの命令型機能を使用できます。例としては、Standard ML、OCaml、F#、Scalaなどがあります。かなり馴染みのある方法で物事を達成できる一方で、機能的な慣用的なスタイルを把握できるようにしたい場合は、これらの1つを検討することをお勧めします。
私は過去にStandardMLを幅広く使用しましたが、学習曲線が少し少ないものを探している場合は、個人的に2番目に好きなプログラミング言語であるScalaをお勧めします。この理由には、図書館の普及、健全な規模のコミュニティ、および開始に役立つ優れた本やチュートリアルの利用可能性が含まれます(特に、Javaを扱ったことがある場合)。
議論されなかった要素の1つは、Haskell、MLのすべてのフレーバー、およびおそらく言及された他のいくつかの言語のように、代数的データ型の特別なパターンマッチング構文の可用性です。パターンマッチング構文は、プログラマーがそれらの関数を数学関数として見るのに役立つ傾向があります。Haskellの構文は十分に複雑であり、その実装では解析エラーメッセージが十分に不十分であるため、その構文はHaskellを選択しない適切な理由です。スキームはおそらく他のほとんどのオプションよりも習得が容易です(そしてスキームはおそらくすべてのマクロシステムの王様です)が、パターンマッチング構文の欠如は、関数型プログラミングの紹介のために私をそれから遠ざけるでしょう。