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

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

新規登録して質問してみよう
ただいま回答率
86.12%
Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

LISP

LISPはプログラミング言語の一種であり、関数型言語に分類されています。 特徴として、括弧を多様する独特の構文を持ちます。

解決済

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

szk24
szk24

総合スコア78

Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

LISP

LISPはプログラミング言語の一種であり、関数型言語に分類されています。 特徴として、括弧を多様する独特の構文を持ちます。

5回答

2グッド

2クリップ

13190閲覧

投稿2016/09/23 08:03

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

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

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

criticabug, tf2014👍を押しています

以下のような質問にはグッドを送りましょう

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

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

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

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

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

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

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

適切な質問に修正を依頼しましょう。

回答5

6

ベストアンサー

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/23 10:46

raccy

総合スコア21689

iwamoto_takaaki, tatsuya6502, criticabug, tf2014, ShiroR, witchy👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

szk24

2016/09/24 00:32

回答ありがとうございます。 うーん、悩ましいですね。どちらも勉強してみたくなりました。 回答を読んでいたら、どちらから勉強するか、余計に悩ましいです。 でも、両方やるのが面白そうなので、どちらからやるか決めて、両方学んでみたいと思います。 ありがとうございました。

0

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

投稿2016/09/23 10:37

HogeAnimalLover

総合スコア4821

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

szk24

2016/09/24 00:34

回答ありがとうございます。 なるほどです。Lispの方が、実用例が多いのですね。 Haskellの関数型の性質が強いというのも魅力的ですね。

0

LISPとHaskellどちらが良い

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

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

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

投稿2016/09/23 10:26

編集2016/09/23 10:33
LLman

総合スコア5590

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

szk24

2016/09/24 00:35

回答ありがとうございます。 Clojureも面白そうですね。 純粋関数型は、魅力的にうつりますね。 どちらにするか、悩ましいです。

0

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

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

投稿2016/09/23 10:19

takasima20

総合スコア7419

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

takasima20

2016/09/23 10:42

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

2016/09/24 00:38

回答ありがとうございます。 Lispがオススメですか。うーん、Lispから関数型を勉強するのもアリかも知れません。 ありがとうございました。

0

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

投稿2016/09/23 08:27

Orlofsky

総合スコア16248

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

szk24

2016/09/23 08:54

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

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

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

LISP

LISPはプログラミング言語の一種であり、関数型言語に分類されています。 特徴として、括弧を多様する独特の構文を持ちます。