私は現在、C、C++、Pythonでコーディングしています。私は関数型プログラミング言語を採用したいと思っていますが、今はHaskellに傾いています。ここで「Haskell vs LISP」戦争を開始したくありません。私が知りたいのはこれです:もし私が主に関数型プログラミングに触れることでHaskellを学ぶなら、もしあれば、後でLispを学ぶことからどんな利益が得られますか?
Haskellを最初に学習し、次にCommon LISPを学習することをお勧めします。私のHaskellでの経験では、静的型付けは最初は制限する煩わしさのように思われましたが、慣れてくると、ほとんどの型エラーの背後に論理エラーが隠れていることに気付きました。この時点に到達すると、次のマイルストーン、つまり型を考え、ソリューションを表現する手段として独自の型を定義することを学ぶとき、Common LISPの準備が整います。
Common LISPを使用すると、モナド、カレーなど、Haskellから好きなものをすべて追加できますが、Frank Sheararが言及したような複数の継承、複数のディスパッチを備えた汎用関数、および高度な例外処理システムも利用できます。
では、なぜCommon LISPを最初に学習しないのですか?手続き型およびOOPバックグラウンドからの経験ですが、関数型プログラミングを排他的に使用するまで、関数型プログラミングを理解できなかったという経験があります。関数型プログラミングが快適になったら、残りのCommon LISPが利用できるようにするツール、および現在のタスクに最適なツールを使用します。
そしてお願いします。
Haskellは、SmalltalkがOOの最も純粋なことを教えているように、少なくとも私が知る限り、FPの最も純粋なことを教えます。 (OOとFPは結婚できないことをお勧めしませんが、これらの言語はどちらも「gem」言語であるため、両極端。)
LISPは実際には言語のファミリーであるため、私が使用するファミリーの特定のメンバーであるため、Common LISPについて説明します。
LISPはあなたに教えることはまだたくさんあります:
HaskellとLISPは、まったく異なる2つの獣です。
Haskellは「象牙の塔での純粋な関数型プログラミング」のようなものです
LISPは、「コードはデータ/データはコード/独自の言語構造を作る」のようなものです。想像できるあらゆる方法でコードを操作できます。
彼らは非常に異なっています。どちらも「関数型プログラミング」の側面を共有していますが、それは、それらの違いと比較すると、本当に小さな共通点です。ちょうどそれらを試してみて、あなたはそれらがどのように異なるかがわかります!
後でLISPを学ぶと、Emacsをカスタマイズできるようになります。これは、おそらく最も利用可能なテキストエディタです。 Haskellではそれはできません。
私がLISPを学ぶことから得られる主な利点は、純粋さを強調する学術言語の文脈で学ぶだけでなく、FPを現実世界指向のマルチパラダイム言語に統合する方法を学ぶことです。
私はC/C++/Pythonのバックグラウンドも持っており、ここ数年でFPを数回試しました。最初はHaskellを見て、頭または尾を作ることができませんでした。 、それからOcamlを試しましたが、それ以上は進みませんでした。最後に、Scalaについて良いことを聞き始め、それを試してみましたが、非常によく合っていることがわかりました(Java =過去に)、1年ほどScala(そして161のプロジェクトオイラー問題をディスパッチしている)に手を出してから、Haskellはもっと理にかなっているようです。 Haskellに関する本を数冊注文し、もう一度やりたいと思っていますが、これは主にScalazの存在が動機です。
したがって、私はマルチパラダイム言語(つまり、Scalaですが、LISPはおそらく法案に適合します)を使用してFPに入る良い方法を見つけました。しかし、Haskellへの飛び込みに満足している場合(私はそうではありませんでした)、ぜひ挑戦してください。
私はもともとC/C++/Rubyのバックグラウンドを持っていて、可能な限りFPでRubyの概念を使用していました。状態はちょっと私の脳を傷つけました。私の仲間の1人がいつの日か私に電話をかけ、彼は私にHaskellで何かを書くように頼みました(私の最初の-そしてできれば最後-Haskellの仕事!)。私はすぐに言語を学び、うまくいった何かを一緒に投げました。それは美しくも何でもありませんでしたが、うまくいきました。
Haskellを使うのに何も必要がなかったので、1か月休憩しました。しかし、自分のブログソフトウェアを作成する必要があると判断したとき、Haskell( https://symer.io )を使用しました。問題をパーツに分割し、入力に基づいてこれらのパーツを異なる方法で実装できるので、Haskellは本当にクールです。 Haskellはまた、値のインテリジェントなボクシングを通じて障害を非常にうまく処理します。これらのボックスを操作するための非常に多くのツールがあり、それらが存在することを忘れてしまいます。
LISP(Scheme)での私の経験は完全に否定的でした。言語にはこれらのインテリジェントでシンプルなツールが欠けていただけでなく、RubyやJavaScriptのように危険なほど緩く感じられました。それは恐ろしい経験であり、RubyやPython以外に新しいものはありません。
C++は、メモリ管理以外では、Haskellへのキャンドルを保持できません。 Haskellは同じくらい高速(高速ではないにしても)、非常に簡潔で、はるかに安全です。しかし、Haskellの安全性は決して邪魔になりません。
TL; TR Haskellは新鮮な空気の息吹であり、LISPは少し機能的なRubyです。