web-dev-qa-db-ja.com

関数型プログラミング入門のためのスキームvs Haskell?

私はCおよびC#でのプログラミングに慣れており、将来はC++を探索します。関数型プログラミングを別のプログラミングパラダイムとして探索することに興味があるかもしれません。私は楽しみのためにこれを行っています。私の仕事はコンピュータプログラミングを含まず、かなり早い段階で大学のコンピュータサイエンスコースで教えられた関数型プログラミングの使用に多少影響を受けています。ラムダ計算は確かに私の数学的な能力を超えていますが、関数型プログラミングは処理できると思います。

関数型プログラミングの入門として役立つHaskellとSchemeのどちらですか?私はテキストエディタとしてemacsを使用しており、Emacs LISPの学習を伴う将来、より簡単にそれを構成できるようにしたいと考えています。ただし、私の理解では、Emacs LISPはSchemeとはかなり異なり、機能的ではなく手続き型でもあります。

私がSchemeを追求するなら、私がすでに買った「The Little Schemer」の本を使うことになるだろう(私がそれに限られたリーフィングから少し奇妙に思える)。または、私がHaskellを追求する場合は、「Great YouのHaskellを学ぶ」を使用します。また、チャンネル9でDr. Erik Meijerによる「Intro to Haskell」のビデオも見ました。

提案、フィードバック、入力を歓迎します。

ありがとう。

追伸ところで、C#の開発に使用するVisual Studio 2010を持っているので、F#にもアクセスできますが、それが言語を選択するための私の主要な基準ではないはずです。

36
haziz

OCamlをお勧めします。

私の個人的な観点では、現代の関数型プログラミングの主な基礎は、高次関数、静的型システム、代数的データ型とパターンマッチングです。

Scheme、ML、Haskellの間で、MLを選択します。MLがこの定義に最も関連があると思うからです。 Schemeには静的型付けがありません(Typed Racketはありますが、Scheme初心者向けではありません)。Haskellには他にも多くのもの(モナド、遅延評価...)がありますが、これは興味深いものですが、重要な基礎から注意をそらす可能性があります。

SMLとOCamlは同様に興味深いものです。私はOCamlに慣れています。ニースというより「実用的な」感覚があります(ただし、魂を失うリスクに「実用的」にしたい場合は、F#を選択することもできます)。

SchemeとHaskellも非常に興味深い言語です。マクロに重点を置いたスキームは興味深いですが、関数型プログラミングとは直接関係ありません(これは、論理プログラミング、スタックベースの言語、機能指向のEと同様に、世界で絶対に試すべきことの1つです)。

Haskellは間違いなく素晴らしい言語であり、関数型プログラミングを志向する教祖にとって必須のポイントだと思います。しかし、OCamlとHaskellのコア言語は非常によく似ているため(初心者の邪魔になる遅延評価を除いて)、OCamlの基本を理解すれば、Haskellを学ぶのは簡単です。むしろ、奇妙なことに集中でき、基本を同時に理解する必要はありません。

同様に、OCamlを、そしておそらくHaskellも見て、さらに詳しく知りたい場合は、CoqまたはAgdaを参照してください。しかし、関数型プログラミングの最初の紹介としてCoqまたはAgdaを推奨する人はほとんどいません...

私の要点を明確にするために:OCaml(またはSML)を学ぶと、Haskellは、Haskellを直接学ぶのと同じくらい優れた機能的プログラマーになるが、より簡単に(またはそれほど苦痛を伴わない)になると思います。
さらに、OCamlとHaskellはどちらも優れた点があり、bothの高度な機能について知るのは興味深いことです。 Haskellを学ぶだけではその面で劣ります(もちろん、Haskellの後でOCamlを学ぶこともできます。私はそれが論理的でなく、イライラするようになると思います)。

OCamlを学ぶために Jason Hickeyの本の草稿(PDF) をお勧めします。

¹この定義は議論の余地があります。一部のSchemeの人々は、静的型付けは関数型プログラミングとは関係ないと主張します。一部のHaskellの人々は、純粋性の定義(「Haskellは何をするか、それ以上」)は関数型言語であるためのsin qua non条件であると主張するでしょう。同意しないことに同意します。

28
gasche

関数型プログラミングのより高度な概念に興味がある場合は、Haskellを使用してください。適切な型システムと突然変異に対する厳格な禁止があります。それでも、Haskellは気弱な人には向いていません。

機能設計の紹介だけが必要な場合は、Schemeを使用してください。構文は、学習と読み取りがはるかに簡単です。手続き型プログラミングは可能ですが、!名前の最後に。

Schemeでは、 コンピュータプログラムの構造と解釈 も読むことができます。これは、プログラミングパラダイムの紹介として最適です。この本には [〜#〜] mit [〜#〜]Berkeley の両方の講義があります。

26
Hoa Long Tam

もちろん、正解は両方です。つまり、どの言語に最初に取り組むかという問題です。私の状況はあなたのものと同じです。リトル・スキーマーはとても楽しかったです。関数型プログラミングの基本的な構成を理解すると、間違いなく理解できます(そして、ゼリーの染みを入れる場所があります!)

Learn You a Haskell for Great goodの約4分の1です。私もそれをかなり楽しんでいますが、2冊の本はこれ以上に違っていません。 Learn You a Haskellには、特定の言語を教えるための非常に伝統的なアプローチがあります。 Little Schemerは、Schemeに固有のものですが、Schemeの言語ではなく、関数型プログラミングの基本を教えることに非常に関心があります。

私は間違いなくリトルスキーマーから始めることをお勧めします。それは実用的ではありませんが、より基本的です。

17
DaveGauer

関数型プログラミングに関する私の2セントは、特定の言語にこだわるのではなく、関数型プログラミングの主要な概念を学ぶことです。私は、上司がすべての開発をAPLで行うように主張するプロジェクトに頭から投げ込まれて、関数型プログラミングを学びました。 APLは関数型配列処理言語であり、LISP、Haskell、またはその他の主流のプログラミング言語から可能な限り離れています。実際の見返りは、関数型プログラミングのパラダイムを「グロッキー」にして、問題を自動的に関数型プログラムに自動的に分解する方法を精神的に学習したときに、Haskellのような他の関数型言語の慣用的な側面にもはや脅かされなくなったことです。 OCaml、Scheme、Scala、Clojure。私はそれ以来、他の関数型言語に追いつくことにかなり成功し、OCaml、Scala、およびSBCLで非常に優れた商用品質のコードを記述しました。

最初の関数型言語を選択する場合、おそらくHaskellまたはSteel Bank Common LISP(SBCL)を選択します。 Haskellの場合、私はLearn You a Haskell ...Real World HaskellThe Haskell Road to Logic、Maths and Programming、およびPearls of Functional Algorithm Design。 CLについては、私はLand of LISPParadigms of Artificial Intelligence Programming、および(本当にハードコアの場合)Let over Lambdaを読みます。 。これらの本をすべて組み合わせて、実用的な関数型プログラミングのアプローチと概念の概要を知ることができます。

ClojureとScalaは、どちらも非常に優れており、非常に表現力豊かな関数型言語であるため、学習することも検討します(FP純粋主義者が言うかもしれませんが)。

17
Marc

「両方を学ぶ」という点には同意しますが、これまでに触れられていない点がいくつかあります。まず、関数型プログラミングに慣れておらず、Haskellを使用している場合は、FP以外にもいくつかの新しいことに直面する必要があります。かなりの労力を必要とする遅延環境での生活方法を学ぶ必要があり、 CまたはC#で使用するシステムとはかけ離れた「実際の」タイプシステムを処理するため。

Scheme、OTOHは異質な構文を持っていますが、学ぶべき静的型システムはなく、それは厳密な言語であるため、物事はより身近になります。さらに、Schemeの実装は非常に順応性がある傾向があります-たとえば Racket はそれを極端にし、遅延バリアントと静的型付きバリアントを提供します。これは、「簡単な」ものから始めて関数型言語を使用するコツをつかむことができ、後で自分自身を成長させて型付きバリアントと遅延型バリアントを使用できることを意味します。一度に1つの機能を処理できるようになったので、これらはより簡単になっているはずです。明確にするために、概念は十分に新しくなり、構文上の問題は軽微でほとんど無関係になります。つまり、新しい概念に取り掛かると、構文が消えるほど忙しいことになります。 (そして、もしあなたが構文を本当に気にしているなら、Haskellの構文は私が個人的に非常にエレガントだと考えるものです-しかし、それはあなたの平均的なC/C#/ C++構文からも非常に離れているからです。)

しかし、すべてのことを言ったので、F#にも良い点があると思います-これは副次的なこととして行うと言いますが、FPを学ぶと、すぐに使いたくなるでしょう。 F#を使用すると、日常業務で扱うのと同じ種類の問題に簡単に取り組むことができるため、より「実際の」ことを実行できます。理想的には、 dたとえば、C#よりもそれを使用することの利点を確認し、一部のプロジェクトで使用します。したがって、F#を選択するのは簡単です。アクセスするのが簡単だからですが、実際にそれ以上のことはないので、それを検討する必要がありますusingこれらの新しい概念。対照的に、SchemeまたはHaskellを使用し、それを目的のおもちゃ言語と見なす場合(たとえ一部の人々がFPことを真剣に考えすぎることは決してありません。[YMMVは主に主観的な観察に基づいており、人によって大きく異なる可能性があります。]

6
Eli Barzilay

48時間以内に自分でスキーマを作成 (haskellで)

私はこれを本当にお勧めします。実際の興味深い問題を使用してHaskellを学習し、作成したインタープリターで遊んで、スキームの最良のレッスンを学習します。この方法を使用する場合は、Haskellの優れた紹介をいくつか残してください。解決すべき問題がある場合は、それらをよりよく理解します。

6
John F. Miller

MLが選択肢にならない理由はありますか?本やコースの配布資料など、かなりの量の入門資料があります。 The Little Schemerがお好きなら、The Little MLerもお楽しみください。最後に、後でF#に簡単に移行できます。 (私がHaskellまたはSchemeをノックしているわけではありません-理想的には3つすべてを学習します)。

また、Emacs LISPに関する警告の言葉。 HaskellもMLもそれを準備することはないと思います。 SchemeなどのLispy言語は役立ちますが、大きな違いがあります。動的スコープ変数。 Emacsの拡張機能は、その性質上、機能的というよりは必須である傾向があります。これらはすべて、エディターの状態を変更することを目的としています。

6
petebu

私はハスケルと一緒に行きます。スキームでは、手続き的なことをするように強制される可能性があり、その型システムはHaskellのものほど有用ではありません。これは、コンパイル時にコードが正しいことをほぼチェックするので、初心者にとってはgreatです。時間。

4
alternative

言語についての議論に巻き込まれ、要点を見逃しがちです。 FPとは何かについて知りたいだけの人にとって、Ocaml/ML/Scheme/Haskellの違いは、資料(本、ビデオ、ツール)の快適さほど重要ではありません。そして、あなたが特定の言語を学ぶのを助ける友人がいるかどうかは、他のすべてに勝ります。

1
autodidakto

あなたがあなたの質問に対して受け取った回答の1つで、私は this link が非常に興味深いことを発見しました。

その気の利いたリンクに加えて、ここにあなたの質問に対する私の見解があります。

命令型プログラミングのバックグラウンドから来ている場合は、関数型プログラミングの学習に多大な労力を費やすことになります。私は学習経験が空でないことを確認します。それはあなたがあなたの現在または次の仕事にそれを適用することができるか、それが何か他の方法であなたを助けることです。

良い言語はたくさんあります。 Scala人々は、ClojureやCLの人々と同様に、彼らの言語を賞賛します。Pythonistasでさえ怠惰だと主張します。あなたが答えた他の人々がMLを提案しました。 Amit Rathore Clojureを書いた人実際には、Haskellを学ぶことさえ提案するかもしれません。

あなたはWindowsとF#について言及しました。それはあなたの現在の立場であなたを助けますか? F#について何も知りません。それは十分に機能していますか? IMHO Pythonには関数構成が含まれていますが、Clojureでのプログラミングとは異なります。

要約すると、「本当に」機能的な関数型言語を学び、そうすることで、状況に最も適したものになります。

0
octopusgrabbus

純粋でない場合は、命令型言語を使用することもできますので、Haskell。

0
pyon