回答:
Haskellを最初に学習し、次にCommon Lispを学習することをお勧めします。Haskellでの私の経験では、静的型付けは最初は制限される煩わしさのように思えましたが、慣れると、型エラーの大部分に背後に隠れている論理エラーがあることに気付きました。この点に到達すると、次のマイルストーンは、型を考え、ソリューションを表現する手段として独自の型を定義することを学ぶことで、Common Lispの準備が整います。
Common Lispを使用すると、モナド、カレー、およびHaskellから好きなものすべてを追加できますが、Frank Sheararのような複数の継承、複数のディスパッチを伴う汎用関数、および高度な例外処理システムも取得できます。
それでは、なぜCommon Lispを最初に学ぶだけではありませんか?手続き型およびOOPのバックグラウンドから来て、私の経験では、関数型プログラミングを排他的に使用する必要があるまで、関数型プログラミングを本当に理解していませんでした。関数型プログラミングが快適になったら、Common Lispで利用できる残りのツールを追加し、目前のタスクに最適なツールを使用できます。
そしてお願いします。
少なくとも私が知っている限り、SmalltalkがOOの最も純粋なものを教えるように、HaskellはあなたにFPの最も純粋なものを教えます。(OOとFPが結婚できないことを示唆するためではありませんが、これらの言語は両方とも「宝石」言語であるため、これは極端な考え方です。)
Lispは本当に言語のファミリーなので、私が使用しているファミリーの特定のメンバーであるため、Common Lispについてお話します。
Lispはまだあなたに教えることがたくさんあります:
後でLispを学習することで、おそらく最も先進的なテキストエディターであるEmacsをカスタマイズできます。Haskellではできません。
HaskellとLispは、まったく異なる2つの獣です。
Haskellは一種の「象牙の塔での純粋な関数型プログラミング」です
Lispは一種の「コードであるデータ/データであるコード/独自の言語構成を作成する」です。想像できるあらゆる方法でコードを操作できます。
彼らは非常に異なっています。どちらも「関数型プログラミング」の側面を共有していますが、それは違いと比較して本当に小さな共通点です。それらを試してみてください、あなたはそれらがどれほど違うかを見るでしょう!
Lispを学ぶことで得られる主な利点は、純粋さを重視するアカデミックな言語のコンテキストでのみ学習するのではなく、FPを現実世界のマルチパラダイム言語に統合する方法を学習することです。
私はまた、C / C ++ / Pythonのバックグラウンドから来ており、ここ数年でFPを数回試しました。最初はHaskellを見て、頭や尻尾を作ることができませんでしたが、Ocamlを試しましたが、それ以上は進みませんでした。最後に、私はScalaについて良いことを聞き始め、それを試してみて、それが私に非常によく合っていることを発見しました(過去にも少しJavaをやっていました)。 Project Eulerの問題)、Haskellはもっと理にかなっているようです。実際、私はHaskellに関する書籍を数冊注文したばかりで、もう1つ試してみたいと思っていますが、これは主にScalazの存在に動機付けられています。
したがって、FPにはマルチパラダイム言語(つまりScalaですが、おそらくLispも当てはまるでしょう)を使用するのが良い方法であることがわかりました。しかし、Haskellに飛び込んで満足しているなら(私はそうではありませんでした)、それを試してください。
私はもともとC / C ++ / Rubyのバックグラウンドを持ち、できればいつでもRubyでFPの概念を使用していました。状態はちょっと私の脳を傷つけた。私の仲間の一人が私に電話してきて、彼は私にHaskellで何かを書くように頼んだ(私の最初の-そして、できれば最後ではない-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です。