104

HaskellとLispのいくつかのフレーバーの両方を経験した人にとって、HaskellとLispの両方でコードを書くことがどれほど「楽しい」(恐ろしい用語を使用する)のか興味があります。

いくつかの背景:私は今Haskellを学んでおり、以前にSchemeとCLで作業していました(そしてClojureに少し進出しました)。伝統的に、あなたは私を動的言語のファンと見なすことができます。それは、動的言語が提供する簡潔さと迅速さのためです。私はすぐにLispマクロに夢中になりました。それは、冗長性と定型文を回避するためのさらに別の方法を私に与えてくれたからです。

Haskellは、私が存在することを知らなかったコーディング方法を紹介してくれるので、非常に興味深いと感じています。部分関数の記述のしやすさなど、敏捷性の実現に役立つと思われる側面が確かにあります。しかし、私はLispマクロ(私はそれらを失うと思います;真実は私がまだそれらについて学んでいないかもしれないと言われていますか?)と静的型付けシステムを失うことについて少し心配しています。

両方の世界でかなりの量のコーディングを行った人は、経験がどのように異なるかについてコメントすることを気になりますか?

4

8 に答える 8

70

簡潔な答え:

  • マクロでできることはほとんど何でも高階関数でできます (モナド、アローなども含めます) が、もっと考える必要があるかもしれません (ただし、最初だけで、楽しくて、あなたはそのためのより良いプログラマー)、および
  • 静的システムは十分に一般的であるため、邪魔になることはありません。また、驚くべきことに、実際に「敏捷性の達成に役立ちます」(あなたが言ったように)。プログラムをコンパイルすると、それが正しいとほぼ確信できるため、この確実性により、試してみることができます。 Lisp と同じではありませんが、プログラミングには「動的」な感覚があります。

[注: Lisp と同じようにマクロを書ける " Template Haskell " がありますが、厳密に言えば、それは必要ありません。]

于 2008-12-25T15:40:13.010 に答える
65

まず第一に、動的型付けのような特定の機能を失うことを心配しないでください。あなたは非常によく設計された言語であるCommonLispに精通しているので、言語をその機能セットに還元することはできないことを知っていると思います。それはすべて首尾一貫した全体についてですよね?

この点で、HaskellはCommonLispと同じくらい明るく輝いています。その機能を組み合わせることで、コードを非常に短くエレガントにするプログラミング方法を提供します。マクロの欠如は、モナドや矢印などのより複雑な(しかし、同様に、理解して使用するのが難しい)概念によっていくらか軽減されます。静的型システムは、ほとんどのオブジェクト指向言語のように邪魔になるのではなく、あなたの力を高めます。

一方、HaskellでのプログラミングはLispよりもはるかにインタラクティブではなく、Lispのような言語に存在する膨大な量の反射は、Haskellが前提としている世界の静的なビューに適合しません。したがって、使用できるツールセットは、2つの言語間でかなり異なりますが、互いに比較するのは困難です。

個人的には、Lispのプログラミング方法が一般的に好きです。それは、自分の仕事のやり方に合っていると感じているからです。ただし、これはあなたもそうしなければならないという意味ではありません。

于 2008-12-25T11:28:04.470 に答える
13

多くはモナドを中心に構造化でき、追加された構文により埋め込みDSLはツリーのように見えなくなるため、Haskellではメタプログラミングの必要性が少なくなりますが、ShreevatsaRで言及されているように、常にテンプレートHaskellがあり、LiskellHaskellセマンティクス+ Lisp構文)括弧が好きな場合。

于 2009-01-07T23:01:18.263 に答える
10

マクロに関しては、次のページで説明しています: Hello Haskell, Goodbye Lisp . Haskell ではマクロがまったく必要ないという観点を説明しています。比較のための短い例が付属しています。

両方の引数の評価を避けるために LISP マクロが必要な例:

(defmacro doif (x y) `(if ,x ,y))

マクロ定義のようなものを必要とせずに、Haskell が両方の引数を体系的に評価しない例:

doif x y = if x then (Just y) else Nothing

そしてほら

于 2010-02-23T23:20:18.270 に答える
9

私は Common Lisp プログラマーです。

しばらく前に Haskell を試したときの私の個人的な結論は、CL に固執することでした。

理由:

  • 動的型付け ( Dynamic vs. Static Typing — A Pattern-Based Analysis by Pascal Costanza を参照)
  • オプション引数とキーワード引数
  • マクロを使用した均一なホモイコニック リスト構文
  • プレフィックス構文 (優先規則を覚える必要はありません)
  • 不純であるため、迅速なプロトタイピングに適しています
  • メタオブジェクト プロトコルを備えた強力なオブジェクト システム
  • 成熟した標準
  • 幅広いコンパイラ

もちろん、Haskell には独自のメリットがあり、根本的に異なる方法でいくつかのことを行いますが、長期的にはそれをカットすることはできません。

于 2009-07-09T08:03:20.243 に答える
6

Haskell では、LISP では不可能な if 関数を定義できます。これは、プログラムのモジュール性を高めることができる怠惰のために可能です。この古典的な論文:ジョン・ヒューズによるなぜ FP が重要なのかは、怠惰が構成可能性をどのように強化するかを説明しています。

于 2009-01-12T21:10:13.593 に答える
5

Haskell では (可能であれば) 扱いにくいマクロを使用して、Lisp で実現できる非常に優れた機能があります。たとえば、`memoize' マクロを見てください (Peter Norvig の PAIP の第 9 章を参照してください)。それを使用すると、foo などの関数を定義し、単純に (memoize 'foo) を評価して、foo のグローバル定義をメモ化されたバージョンに置き換えることができます。Haskell で高階関数を使用して同じ効果を達成できますか?

于 2009-09-09T14:31:36.503 に答える
4

Haskell 学習の旅を続けていると、マクロを "置き換える" のに役立つことの 1 つは、独自の中置演算子を定義し、それらの優先順位と結合規則をカスタマイズできることだと思われます。ちょっと複雑だけど面白いシステム!

于 2008-12-29T23:42:31.847 に答える