Haskell AND Lisp vs. Haskell OR Lisp [終了]


40

現在、C、C ++、およびPythonを使用してコーディングしています。関数型プログラミング言語を使いたいと思っていますが、今はHaskellに傾倒しています。ここで「Haskell vs Lisp」戦争を始めたくありません。私が知りたいのはこれです:主に関数型プログラミングに触れるためにHaskellを学んだ場合、後でLispを学ぶことでどんな利益が得られますか?


1
そしてF#とClojure。
13:45にcnd

回答:


58

Haskellを最初に学習し、次にCommon Lispを学習することをお勧めします。Haskellでの私の経験では、静的型付けは最初は制限される煩わしさのように思えましたが、慣れると、型エラーの大部分に背後に隠れている論理エラーがあることに気付きました。この点に到達すると、次のマイルストーンは、型を考え、ソリューションを表現する手段として独自の型を定義することを学ぶことで、Common Lispの準備が整います。

Common Lispを使用すると、モナド、カレー、およびHaskellから好きなものすべてを追加できますが、Frank Sheararのような複数の継承、複数のディスパッチを伴う汎用関数、および高度な例外処理システムも取得できます。

それでは、なぜCommon Lispを最初に学ぶだけではありませんか?手続き型およびOOPのバックグラウンドから来て、私の経験では、関数型プログラミングを排他的に使用する必要があるまで、関数型プログラミングを本当に理解していませんでした。関数型プログラミングが快適になったら、Common Lispで利用できる残りのツールを追加し、目前のタスクに最適なツールを使用できます。


6
HaskellとSmalltalkを学習に非常に役立つものにしているのは、その純粋さです。
フランクシェラー

4
私は、純粋さは言語の学習をはるかに容易にすることに同意します。関数型言語自体はLISPでは理解できませんでした。なぜなら、言語ではすべてが可能であり、オブジェクト指向のバックグラウンドがあまりにも必要だからです。しかし、Haskellには、学習を混乱させるような概念はありません。
エオニル

1
面白いです、私は反対の経験をしました。私は私の最初の言語であるSchemeを通して関数型プログラミングの要点を取り上げました。私はときどきHaskellをハックしますが、Haskellをしばらく離れるたびに知っていたものの90%以上を再学習しなければならないことは避けられません。とはいえ、Haskellは信じられないほど豊富な言語であり、非常に多くの量を(非常に強制的に)教えます。タイプに従ってください!
ジョシュインフィスト

31

そしてお願いします。

少なくとも私が知っている限り、SmalltalkがOOの最も純粋なものを教えるように、HaskellはあなたにFPの最も純粋なものを教えます。(OOとFPが結婚できないことを示唆するためではありませんが、これらの言語は両方とも「宝石」言語であるため、これは極端な考え方です。)

Lispは本当に言語のファミリーなので、私が使用しているファミリーの特定のメンバーであるため、Common Lispについてお話します。

Lispはまだあなたに教えることがたくさんあります:

  • マルチパラダイムなので、dsimchaが指摘するように、FPを他のパラダイムと統合する方法を示します。
  • Lispは、例えばそのマクロを通じて、「コードはデータ、データはコード」であることを教えてくれます。
  • CLOSは非常に興味深いOOブランドであり、複数の継承が機能し、汎用機能を備えています。

11

後でLispを学習することで、おそらく最も先進的なテキストエディターであるEmacsをカスタマイズできます。Haskellではできません。


14
[かっこを削る]
イナイマシ

6
たぶん誰かがそれのためにテキストエディタを書くことができます。Emacsオペレーティングシステムには付属していません。(私は子供。バイパーモードを取得できることを知っています。)
greyfade

14
実際、YiというEmacsクローンがあり、EmacsがLispを使用するのとまったく同じ方法でHaskellを使用します。実際、(GNU)Emacsと比較すると、YiはカーネルもHaskellで記述されているため、さらに純粋です。一方、Emacsカーネルは一般にLispで記述されない傾向があります。たとえば、GNU EmacsのカーネルはCで書かれ、JEmacsのJavaはJavaで書かれています。
ヨルグWミットタグ

2
@Jörg、GNU EmacsまたはXEmacsの完全なクローンではなく、部分的な再実装である場合、同じものではありません。WordとWordpadまたはNotepadの比較に似ています。

1
するThorbjörnRavnアンデルセン@:はい、ではなく、非常にその悪いです。:)
greyfade

11

HaskellとLispは、まったく異なる2つの獣です。

Haskellは一種の「象牙の塔での純粋な関数型プログラミング」です

Lispは一種の「コードであるデータ/データであるコード/独自の言語構成を作成する」です。想像できるあらゆる方法でコードを操作できます。

彼らは非常に異なっています。どちらも「関数型プログラミング」の側面を共有していますが、それは違いと比較して本当に小さな共通点です。それらを試してみてください、あなたはそれらがどれほど違うかを見るでしょう!


+1:良い点。HaskellとLispを知っています。私はどちらの専門家でもありませんが、あなたは彼らが非常に異なっていることは正しいと思います。Haskellでは、データをコードとして使用するという考えはありません。Lispでは、(一致する)パターンマッチングはありません。おそらく、違いのリスト(!)はもっと長くなります。
ジョルジオ

7

Lispを学ぶことで得られる主な利点は、純粋さを重視するアカデミックな言語のコンテキストでのみ学習するのではなく、FPを現実世界のマルチパラダイム言語に統合する方法を学習することです。


5
「Haskell vs Lisp」戦争が欲しいと思います!
ドンロビー

3
Haskell 、純粋さを強調するアカデミック言語です...そして多くの人々がそれを現実の世界で使用しています。Smalltalkもそのキャンプにいます。
フランクシェラー

多くの人が現実世界でHaskellを使用していますか?
ジョンハロップ

1
@ジョンハロップ:まあ、私は現実の世界ではHaskellを使うのです(そしてそれは、特定の用途のために本当にうまく動作します)、多分私はいくつかの一人(?)
ジョルジオ

5

私はまた、C / C ++ / Pythonのバックグラウンドから来ており、ここ数年でFPを数回試しました。最初はHaskellを見て、頭や尻尾を作ることができませんでしたが、Ocamlを試しましたが、それ以上は進みませんでした。最後に、私はScalaについて良いことを聞き始め、それを試してみて、それが私に非常によく合っていることを発見しました(過去にも少しJavaをやっていました)。 Project Eulerの問題)、Haskellはもっと理にかなっているようです。実際、私はHaskellに関する書籍を数冊注文したばかりで、もう1つ試してみたいと思っていますが、これは主にScalazの存在に動機付けられています。

したがって、FPにはマルチパラダイム言語(つまりScalaですが、おそらくLispも当てはまるでしょう)を使用するのが良い方法であることがわかりました。しかし、Haskellに飛び込んで満足しているなら(私はそうではありませんでした)、それを試してください。


OCamlよりもScalaでさらに進んだことは興味深い。どうして?
ジョンハロップ

@ジョン:良い質問です。言いにくい。たぶん、私はその時点で機能するようになる準備ができていなかったのかもしれません。たぶん私はたまたま適切なレベルでピッチされたScalaチュートリアルを見つけただけです。多分ScalaのC / C ++ / Java系統は、少し異質なものにしたのかもしれません。最近はScalaではなくF#に合理的な賭けがあることを考えると、おそらくOCamlドメインをいつかは再訪することになるでしょう。デイジョブ、私は次にHaskellを再試行するというひねくれた傾向があります。
ティムデイ

スムーズな移動アプローチ:)
エオニル

2

私はもともと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です。

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