質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.99%

LISPとHaskell 勉強するならどちらが良い?

解決済

回答 5

投稿

  • 評価
  • クリップ 2
  • VIEW 7,290

szk24

score 75

関数型プログラミングを勉強しようと思っているのですが、LISPとHaskellどちらが良いのでしょうか?

詳しい方いらっしゃいましたら、教えて下さい。

よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+5

Q: LISPとHaskellどちらが良いのでしょうか?
A: 両方するのが良いです。

では、だめですよね。はい、ということで、始めにどちらをすべきかと言う指針を示したいと思います。

LISP

Cと同じぐらい、一度はやっておけという言語です。さて、最初の関数型プログラミングの考え方はLISPから始まったと言っても過言ではありません。なら、関数型プログラミングを学ぶにはLISPが良いんだな…という結論づける前に、どのLISPで?という問題が立ちはだかります。単にLISPと言っても、たくさんの方言があります。有名なのは下記でしょうか。

  • 純LISP … LISPとして成り立つ最低限の機能に絞ったLISP。実用性は皆無。論文を書くために存在すると思われる。実装は可能とあるが、実装はあるのだろうか?
  • Scheme … 主に教育分野で使われる。学習には一番向いているのかも知れない。ついでにSICPも読んでおくと、プログラミングに関する造詣が深まると思われる。実装がたくさんあるし、なにやらバージョンで揉めたこともあるようだ。
  • Common Lisp … たくさんある方言をまとめて、統一しようとしたLISP。実用性第一。しかし、そのため、関数型プログラミングだけではなく、手続き型プログラミングのパラダイムも取り入れてしまっている。
  • Emacs Lisp …  Emacsの拡張言語として使うためのLISP。Emacs使いであれば必須。
  • Clojure … JavaVMや.NET上で動くLISP。一時期JavaVM用言語として持て囃されていたが、最近はScalaやKotlinに押され気味のような気がする。

学習目的ならSchemeが良いのではないかと思います。ただ、実用性で言えば、Common LispやEmacs Lisp、Clojureの方があると思います。注意して欲しいのは、これらのLISP方言のほとんどが純粋関数型プログラミングではないということです。変数の再代入など、手続き型のような処理もできてしまいます。また、末尾再帰の最適化や遅延評価などが必ずしもあるとは限りませんし、モナドを言語としてあまり考慮していません。

ラムダ式や再帰関数、リスト処理といった所を学習するのであれば、LISPでも十分でしょう。しかし、全てが純粋関数型プログラミングではない事に注意すべきです。単純なハローワールドである(display "hello, world!\n")(Schemeでの記述)ですら副作用の塊であり、関数型プログラミングではありません。IO処理は手続き型の方が簡単で、理解しやすいですが、全体が結局どこか混ざった記述になってしまうと言うことを考えておくべきです。

Haskell

正真正銘の純粋関数型プログラミング言語です(実際には副作用を伴う関数が存在しますが、通常は「禁じ手」扱いです)。末尾再帰の最適化は当たり前なので、再帰関数を作るのは普通のこと。遅延評価による処理の最適化。モナドを用いた、副作用に対する純粋さの維持。そして、Haskellには手続き型にあるような変数の再代入などという不純物はありません。ですので、関数型プログラミングを強要されると言うところが、最大の利点です。

Haskellを使うと、手続き型の考えは全く通用しません。ループにするには再帰にするしかありませんし、配列はその中身を変更することもできませんので、新たに配列を作って行くようにするしかありません。関数型プログラミングの考えでアルゴリズムを考えないと、まともなプログラミングが一切できません。今までの物が使えないというのは欠点のように思えるかも知れませんが、逆に、今までの物を一旦捨てて、関数型プログラミングだけを学ぶには、手続き型で考えてしまう甘えなくすには、とても良い言語だと思います。

結論

好きな方から始めた方が良いかと思います。Cのような手続き型プログラミングしかしたことがない人から見ると、どちらも戸惑いは大きいです。甘えをなくしたいのであればHaskell、モナドとかは置いといて、ラムダ式や再帰関数、リスト処理などをまずは学びたいならLISPが良いのではないでしょうか。

でも、結局は、最終的にどちらもすべきということです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/24 09:32

    回答ありがとうございます。

    うーん、悩ましいですね。どちらも勉強してみたくなりました。

    回答を読んでいたら、どちらから勉強するか、余計に悩ましいです。

    でも、両方やるのが面白そうなので、どちらからやるか決めて、両方学んでみたいと思います。

    ありがとうございました。

    キャンセル

0

ググると関数型プログラミングについて の類がいっぱい見つかります。Scala も良さそう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/23 17:54

    そうなんですよね。あ、回答ありがとうございます。

    最初は、Scalaを勉強しようと思っていたのですが、調べていたら、純粋な関数型言語として、LISPとHaskellがでてきたので、そちらを勉強しようかと思ったのですが、どちらが良いか、よくわからなくて…。それで、質問させて頂きました。

    キャンセル

0

LISPでいいんじゃないスかね。
ただし、LISPと一言でいってもいろいろあるようです。
たとえば、気軽にスクリプトを書けるGaucheを試してみるのもアリ!?
http://www.atmarkit.co.jp/ait/articles/0810/31/news148.html

Haskellはガチガチの関数型ってイメージあります。
なかなかにとっつきにくい、というかHaskellらしい
プログラミングってのを習得するのが難儀しそうですが、
使いこなせれば関数型に一家言もてると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/23 19:42

    Erlangは一時期話題になったと思うけど、今はどうなんだろ?
    OCamlは海外では普通に使われてるイメージ?
    Scalaは(自分の中で)ハイブリッドってイメージが強いかなあ。

    キャンセル

  • 2016/09/24 09:38

    回答ありがとうございます。

    Lispがオススメですか。うーん、Lispから関数型を勉強するのもアリかも知れません。

    ありがとうございました。

    キャンセル

0

LISPとHaskellどちらが良い

「関数型プログラミング」に特化して学びたいなら、Haskell。
なにせ純粋関数型ですし、モナドなど、
現代的な関数型の機構が充実しています。
関数型のイメージが一番強い言語だと思います。

じゃあLispの方は何なの、という話ですが、
非純粋の関数型なので、手続き型から段階的に移行しやすい。
また、Common Lispでは、「CLOS」でOOも使える。メタプログラミングを学びやすい。
そして、Lisp方言のClojureは、Javaのライブラリを使えて実用的。

つまり単純化すると、純粋関数型のHaskellと、マルチパラダイムのLispの違いです。
なお、別にこの二択というわけでもなく、Scalaとかも実用的には有力だと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/24 09:35

    回答ありがとうございます。

    Clojureも面白そうですね。

    純粋関数型は、魅力的にうつりますね。

    どちらにするか、悩ましいです。

    キャンセル

0

「関数型」の性質が強いのはHaskellですね。Lispはこの性質が弱いですが、代わりに実用的な例が豊富であると思えます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/24 09:34

    回答ありがとうございます。

    なるほどです。Lispの方が、実用例が多いのですね。

    Haskellの関数型の性質が強いというのも魅力的ですね。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる