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


36

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

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

Schemeを追求すれば、すでに購入した「The Little Schemer」の本を使用している可能性があります(限定的なリーフィングから少し奇妙に思えます)。または、私がHaskellを追求する場合、「Learn Good a Haskell for Great Good」を使用します。また、チャンネル9でErik Meijer博士によるHaskellの紹介ビデオも見ました。

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

ありがとう。

PS BTW C#開発に使用しているVisual Studio 2010があるため、F#にもアクセスできますが、言語を選択するための主要な基準とは思われません。


3
忘れないでくださいReal World Haskell
代替案

15
副次的なコメント:ラムダ計算は非常に単純なシステムです。それについてのクールなことは、それが複雑であるということではなく、反対です。このようなシンプルなシステムで必要なものをすべて表現できること。プログラミング言語から始めます。今投げるEVERYTHING変数の参照、関数定義、および関数呼び出しを除きます。出来上がり!ラムダ計算。


9
5分でラムダ計算を教えることができます。さて、今学んだことの結果を理解するには一生かかります。:)

5
主にかっこがあまりないため、SchemeよりHaskellを選択しました!
ジョーイアダムス

回答:


27

OCamlをお勧めします。

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

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

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にはどちらも優れた特徴があり、両方の高度な機能について知ることは興味深いです。Haskellを学習するだけでは、その点で劣ります(もちろん、Haskellの後にOCamlを学習することもできますが、論理的ではなく、イライラするでしょう)

OCamlを学習するには、Jason Hickeyの本草案(PDF)をお勧めします。

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


3
OCamlの方を教えてくれてありがとう、そしてそうです、私は魂を危険にさらし、F#を探検します。私はLinux、Mac OS X、およびWindows(主に前者)向けに開発を行っていますが、FSIはすでに行っている3つのプラットフォーム(LinuxおよびMac OS Xでモノを実行)すべてで利用できるようです。Microsoftの全重量が関数型プログラミング言語の背後にある(「不純な」言語であるにもかかわらず)という事実は、関数型プログラミングのファンから非難されるのではなく、歓迎されるべきです。
haziz

SMLは死んでいます、ocamlはcoqを書くために存在します
permeakra

1
MLの場合は+1。Haskellよりも明確です。
m3th0dman

また、SMLまたはOCamlを学習してから、Haskell(+1)を学習するのも良い考えです。これらの言語を知った後、別の言語(Scalaなど)を選択するのは非常に簡単です。さらに、Scheme、Common Lisp、Clojure(この順序で)を見て、動的言語の感覚をつかむことができます。
ジョルジオ

@haziz:彼らは良いソフトウェアを作成する場合でも、マイクロソフト(または、そのことについては、オラクルなどが)など、顧客のロックイン互換性のないフォーマット、などのすべての関係の悪い習慣、互換性のない実装で、独占企業のまま
ジョルジオ

26

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

機能設計の概要だけが必要な場合は、Schemeに進みます。構文は、学習と読み取りがはるかに簡単です。それは手続き型プログラミングを可能にしますが、ただ、あなたが!が、名前の最後に。

Schemeを使用すると、プログラミングのパラダイムへの最良の入門書である、コンピュータープログラムの構造と解釈も読むことができます。MITバークレーの両方からの本に関する講義があります。


4
「構文の学習と読み取りははるかに簡単です」は非常に主観的です。

6
@luqui:はい。おそらく「通常」のほうが良い言葉です。バックティック、中置記号、優先順位、または結合性の問題はありません-ただの括弧、たくさんの地味で愚かな括弧。
ホアロングタム

17

正しい答えは、もちろん両方です!ですから、どの言語を最初に取り組むべきかという問題にすぎません。私の状況はあなたと同じです。The Little Schemerを大いに楽しんだ。関数型プログラミングの基本的な構成要素を理解したら、間違いなく理解できます(ゼリーの汚れを置く場所があります!)

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

The Little Schemerから始めることをお勧めします。実用的ではありませんが、より基本的です。


17

関数型プログラミングに関する私の2セントは、特定の言語にこだわるのではなく、関数型プログラミングの重要な概念を学ぶことです。私は、上司がすべての開発をAPLで行うことを主張するプロジェクトに真っ先に投げ込まれて、関数型プログラミングを学びました。APLは機能配列処理言語であり、LISP、Haskell、または他の主流のプログラミング言語から可能な限り離れています。実際の見返りは、関数型プログラミングのパラダイムを「手探り」し、問題を自動で魔法のように関数型プログラムに分解する方法を精神的に学んだ後、Haskellのような他の関数型言語の慣用的な側面に本当に脅かされなくなったことでした。 OCaml、Scheme、Scala、Clojure。私'

最初の関数型言語を選択する場合、おそらく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純粋主義者の言うことにもかかわらず)


6

「両方を学ぶ」という点には同意しますが、まだ言及されていない点がいくつかあります。まず、関数型プログラミングを初めて使用する場合、Haskellを使用する場合は、FP以外にもいくつかの新しいことに直面する必要があります。かなりの労力を要する怠environmentな環境での生活方法を学ぶ必要があります。 CまたはC#で使用するものとは非常に異なる「実際の」型システムを扱うため。

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

しかし、それをすべて言った上で、F#には良い点もあると思います-これは副次的なこととして行うと言いますが、FPを学ぶとすぐにその良いものをすべて使いたくなるでしょう。F#を使用するということは、日中の仕事で対処するのと同じ種類の問題にたぶん簡単に取り組むことができるため、より多くの「本物の」ことができることを意味します。理想的には、たとえばC#に比べてそれを使用する利点を理解し、それをプロジェクトで使用するところまで到達します。したがって、アクセスしやすいという理由だけでF#を選択しないのは正しいことですが、実際に使用するよりも優れているものはないため、それを検討する必要があります。これらの新しい概念。対照的に、SchemeまたはHaskellを使用し、それを目的のおもちゃの言語と考える場合(実際のアプリケーションで一部の人がそれを使用していることを知っていたとしても)、FP全体をあまりに真剣に受け止めることはありません。[しかし、YMMVは、主に主観的な観察に基づいており、人によって大きく異なる可能性があります。]


6

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

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


ML / OCamlの方を教えてくれてありがとう。そう、「魂を危険にさらして」、F#を探検する。私はLinux、Mac OS X、およびWindows(主に前者)向けに開発を行っていますが、FSIはすでに行っている3つのプラットフォーム(LinuxおよびMac OS Xでモノを実行)すべてで利用できるようです。Microsoftの全重量が関数型プログラミング言語の背後にある(「不純な」言語であるにもかかわらず)という事実は、関数型プログラミングのファンから非難されるのではなく、歓迎されるべきです。
haziz

ところで私はAmazonからリトルMLerを注文しましたが、すでにそれを受け取っており、私の旅で始めました。また、ライブラリにLearning F#を追加しました。The Little MLerを補うために使用する、より主流の教育ガイドのようです。
haziz

6

48時間でスキームを作成する(haskellで)

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


実際にこのwiki / pdfを使用してHaskellを学び、OCamlスキルを磨きました(慣用的なHaskellをOCamlに翻訳することにより)。誰かがこの資料を取り、いくつかの関数型言語のために「フォーク」できるなら、それはかなりクールだろう。かなりクールで機能的な言語の銃撃戦の基礎になるかもしれません!
マーク

1
これの主な問題は、モナドを導入せずにパーセクを導入することです。
代替

@alternative parsecにはMonadicインターフェイスがありますが、他の多くの機能は言うまでもなく、Applicativeインターフェイスもあります。モナドの一般化の前にParsecを導入するのは理不尽ではありません
フィリップJF

4

Haskellと一緒に行きます。スキームでは、手続き的なことをするようにプッシュされる可能性があり、そのタイプシステムはHaskellのものほど有用ではありません。これは、コンパイル時にコードが正しいことをほとんどチェックするため、初心者にとっては素晴らしいです。


3
「コードが正しいことをほとんどチェックする」ことは非常に間違っています。型システムはそれを行うことができません。(型システムが真の定理証明者でない限り。)
エリバルジレイ

4
@エリ、Haskellを使ったことがありますか?理論的にはこの記述は明らかに間違っていますが、実際には、少なくとも私が使用した他のすべての言語と比較すると、かなり正確であることがわかりました。とは言うものの、実際には、これが初心者にとって良い財産であることには同意しません。ロープを学んでいるときは、エラーメッセージが使用しているボキャブラリーさえ知らないときにコンパイラに間違っていると叫び、それと戦わなければならないのではなく、コードが間違っていることを具体的に見てみたいです。

1
ここでは、@ Eliの「かなり」が重要な用語です。Haskellでは、それを実装する方法についてより多くの時間を費やすと、実装は非常に簡単になります。次に、それをタイプチェックして、マップ、折り畳みなどが正常であることを確認します。
代替

@Eli Barzilay:Haskellの型システムは、定理証明者に非常に近いようです。それは確かに定理証明が他のツールよりもより一般的に見える環境を作成しました。(私が因果関係を示唆しているわけではありません。)
greyfade

@luqui-はい、使用しました。いいえ、実務上も理論上も、それはまだ虚偽の陳述です。しかし、それはHaskellに固有のものではありません。
エリバルジレイ

1

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


0

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


0

質問に対して受け取った回答の1つで、このリンクが非常に興味深いことがわかりました。HaskellとSchemeの味がわかるからです。

その気の利いたリンクに加えて、あなたの質問に対する私の見解を以下に示します。

あなたが命令的なプログラミングのバックグラウンドから来ているなら、あなたは関数型プログラミングの学習に多くの努力を注ぐことになるかもしれません。学習経験が空でないことを確認します。つまり、現在のジョブまたは次のジョブに適用できること、または他の方法で役立つことです。

良い言語がたくさんあります。Scalaの人々は、ClojureとCLの人々と同じように、彼らの言語を称賛するでしょう。Pythonistasでさえ怠を主張します。あなたに答えた他の人々はMLを提案しました。Clojure in Actionを書いたAmit Rathoreは、Haskellを学ぶことを提案するかもしれません。

WindowsとF#について言及しました。それはあなたの現在の位置であなたを助けますか?F#については何も知りません。機能は十分ですか?私はPythonに機能的な構造がありますが、Clojureでのプログラミングとは違いますので、お願いします。

要約すると、「本当に」機能的であり、そうすることであなたの状況にとって最も意味のある関数型言語を学んでください。


-2

比較的初心者の観点から、Schemeを決定する場合、数学がかなり成熟していない限り、SICPから始めないことをお勧めします。本とビデオは微妙に満ちており、始めたばかりの人にはまったく直感的ではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.