LISPとHaskellを使用する利点は何ですか?彼らは私をより良いプログラマにしてくれるでしょうか?[閉まっている]


41

LispとHaskellはそれぞれ論理プログラミング言語と関数型プログラミング言語であることは知っていますが、これはどういう意味ですか?他の言語とどのように違いますか?これらを学ぶことはあなたをより良いプログラマにし、ロジックを改善すると聞いたことがあります。これは本当ですか?LispまたはHaskellを有能なレベルに習得すると、プログラミングが改善され、どの言語でも問題を処理できるようになりますか?それらが学習の努力に値するかどうかを知りたいだけです。また、これらの言語はGUIやグラフィックスなどの分野で役立ちますか、それともコンソールアプリケーションだけで役立ちますか?


36
LISPとHaskellを使用すると、より良いLISPとHaskellのプログラマーになります。保証します。
ニール

17
@MasonWheeler言わなければならない。Haskellの型システムには他の言語には見られないものがたくさんあり、LISPマクロは主流の言語には見当たりません。彼らはので、これらのものの両方が学習する価値があるもしあなたの作業言語でより良いプログラマーします。少なくともこれは私の経験でした。Haskellは私をより良いエンタープライズC#開発者にしました。関心の分離を実装するためのテクニックは、私が他の方法では絶対にできないことを知っており、解析の問題はHaskellを学ぶ前よりずっとずっと簡単になります。
ジミー・ホッファ

6
Erlangは関数型言語です。Rabbit MQはErlangで記述されており、多くの場所でRabbitを使用して、ミッションクリティカルな多くの重荷を持ち上げます。関数型言語は、プログラミングについて異なる考え方をすることを教えてくれます。それは、自由に使える素晴らしい追加ツールです。これらの概念のいくつかがより一般的な言語(C#およびC ++のラムダ式など)になっているのは事実ですが、関数型言語を使用する場合は、非常に異なる方法で問題解決にアプローチします。
バイナリの心配

8
@MasonWheeler言語が他の言語よりも有用であるかもしれないが、まだ広く使用されていない完全な理由があります。私は多くのことを考えることができます:既存のユーザーベース、あまりに急進的な変更、「良いことで十分」、そして...より良いツールがより正式に訓練されたプログラマーを必要とするとき。したがって、人気有用性の良い尺度ではありません。
アンドレスF.

5
@MasonWheeler類推を使用するために、数学は実生活で非常に有用な分野です。それでは、なぜより多くの人が数学に精通していないのでしょうか?なぜ多くの人々がそれを怖がり、それは黒魔術であり、実際にはそれほど有用ではないと思いますか?
アンドレスF.

回答:


37

数学を学ぶことで分析スキルが向上し、ラテン/古典文学を学ぶことでライティングスキルが向上することに非常に似ています。

これらの言語を設計した人々は、プログラムの作成が何を意味するのかを熱心に考えてきました。そして、それらの言語はそれらの研究の結果です。

とは言っても、Javaを学ぶことはあなたをより良いプログラマーにすることにもなります。Cの学習。本当のメリットは、異なる哲学を持つ言語を学習することです。その後、プログラムの作成方法について独自の意見を持つことができます。

編集

この答えは、まだhaskellやlispを学んでいない人にはあまり役に立たないことを理解しています。ここに私が意味することをさらに説明するためのいくつかの例があります

LISP

Lispは、構文は最小限であるべきであり、すべてがリストまたはプリミティブであると考えています(LispはList Processingの略です)。プログラムでさえ、主に他のリストとシンボルを含むリストです。Lispを使用すると、プログラムをリストとして操作し、新しいプログラムをその場で生成できます。したがって、code is data and data is codeモットー全体。

直接的な結果は、Lisp言語を使用すると、必要なインターフェイスを定義できることです。良い例は、clojure Webフレームワークであるcompojureです。ルーティング機能は次のようになります

(defroutes app-routes
  (GET "/" [] view/page)
  (GET "/api" [] (wrap-aleph-handler api/socket-handler))
  (route/resources "/static")
  (route/not-found "page not found"))

もう1つの良い例は、しゃっくりテンプレートフレームワークです。

(html [:ul
  (for [x (range 1 4)]
    [:li x])])

ご覧のとおり、結果は口ひげのようなDSLのように簡潔ですが、などの言語機能を使用できます(for [x (range 1 4)] block)。さらに良いことに、コードを抽象化して構造化するためのすべてのツールがあります。

他の言語では、構文はより複雑です。Javaプログラムを一連のリストとして読み取ることはできません。しかし、Lispを使用することにより、理想的なインターフェイスがどのように見えるべきか、コード内でデータとして抽象化できるものについて、より良いアイデアを得ることができます。また、お気に入りの言語をビッグデータ構造として認識し、そのセマンティクスをよりよく理解するのにも役立ちます。

ハスケル

Haskellは、強力な静的型付けと純度を信じています。純粋な関数は数学関数に似ています。値のセットで定義され、別のセットにマッピングされます。関数には副作用がなく、値は不変です。純度は、マルチパラダイム言語が持つことができるものではないため、興味深いものです。言語は純粋かそうでないかのどちらかです。

結果の1つは、いつでもIOアクションを実行できないことです(これは良いことだとハスケラーは信じています)。IOアクションはトランザクションとして定義され、それ自体が純粋な値です。mainhaskellプログラムの値は、プログラムの実行時に実行されるIOトランザクションです。

プログラムのデータフローを明示的に処理する必要があります。グローバル変数の内容を読み書きすることにより、2つのコンポーネントを通信させることはできません。値を作成して渡す必要があります。

Jimmy Hoffaが言及したもう1つの機能は、リッチタイプシステムです。他の言語には静的型付けがありますが、haskellでは次のようなことができます。

length :: [a] -> Int (aのリストからintへの関数)

map :: (a -> b) -> [a] -> [b]a to b変換とaのリストを受け取り、bのリストを返す関数)

良いことは、これらの関数が実際に何をするかを説明する必要がないことです。あなたはすでにそれらの振る舞いを理解しています。さらに、これらのシグネチャを持つ関数は、リストの長さを計算し、リストに変換をマッピングする以外、実際には何もできません。

他の型付き言語では、クラス階層と可変性を組み合わせることで、これらの型を扱うのが悪夢になります。言語の観点から正しく理解することは不可能です(つまり、単純、強力、安全)。

安全なパス(scalaなど)を使用して本当に複雑な言語になるか、単純なパスを使用して制限(google go genericsはリストとマップに限定)または安全でない(常にdartジェネリック)共変)。

haskellを使用することで、主に純度の利点と、純粋なコードの書き方について学びます。


1
@JimmyHoffa私は実際に独自の答えに値すると思います。これは人々が見落としがちなものだからです。機能プログラミングによって最もよく解決される問題領域がありますが、それは少なくとも快適な領域の外側の領域に手を出さない限り、人々は存在すら気付かないものです。
KChaloux

2
アセンブリについては知りませんし、それについても言及しませんでした。ただし、アセンブリは、プログラムの実行方法を理解するのに役立ちます。パフォーマンスの問題を説明するために、生成されたアセンブリの一部を分析できる人々のSOに関する素晴らしい投稿があります。
サイモンベルゴ

3
@KChaloux私は答えを書きますが、この質問は閉じられるべきです(私はそれに応じて投票しました)。簡単に言えば、自分の意見と経験を答えに書くことができますが、それは他の答えと同じか間違っているわけではありません。
ジミー・ホッファ

7
OMG、コンピュータが実際に何をしているのかを知ること@Neil 最も確実にあなたをより良いプログラマを行います。私は何年もアセンブリを書きませんでしたが、定期的に(多くのプラットフォームで)読みました。プログラムが実際にどのように動作するかを気にするなら、少なくとも基本を知ることが重要です。
ダッシュトムバン

3
@ニール、どのような場合に悪いプログラマーに利益があるのですか?スパゲッティコードを作成する理由は何ですか?アセンブリを知らず、学習を避けるために合理化を必要とする空想の世界を除いて、スパゲッティコードはアセンブリまたは優れたプログラマーと何の関係がありますか?どちらかといえば、優れたアセンブリコーダーであると、悪いコーディングプラクティスを非常に意識するようになります。
ダッシュトムバン

12

tl; dr新しいことを学ぶことはあなたをより良いプログラマにするだけですが、より良いプログラマになることはコードを書くことができる言語についてではありません。

LISPとHaskellを使用する利点は何ですか?

LISP:

  1. 同形コード。これにより、構造化された自己変更コードが可能になります。
  2. 構文認識マクロ。定型コードの書き換えが可能です。
  3. プラグマティズム。CLは、専門家が作業を行えるように設計されています。原則として、ほとんどの関数型言語はそうではありません。
  4. 柔軟性。それは多くの異なることを、すべて合理的な速度で行うことができます。
  5. いぼ。現実の世界は乱雑です。実用的なコーディングは、厄介な構造を使用または発明する必要があります。Common Lispには十分な注意力があり、作業を完了できます。

間違いなく、CLに対して選択する唯一の本当の理由は、標準ライブラリが日付付けされていることです。

私は手足に出て、一般的な場合、プロのソフトウェア労働者にとって構文は問題ではないだろうと言います。

From:Lispが便利なのはなぜですか?

ハスケル:

Haskellはコンピュータープログラミング言語です。特に、多態的に静的に型付けされた、怠zyで純粋に機能的な言語であり、他のほとんどのプログラミング言語とはまったく異なります。この言語はHaskell Brooks Curryにちなんで名付けられました。HaskellBrooks Curryの数理論理学の仕事は関数型言語の基礎となります。Haskellはラムダ計算に基づいているため、ロゴとして使用するラムダです。

あなたはそこに機能的対命令の説明を読むことができます

From:http : //www.haskell.org/haskellwiki/Introduction

彼らは私をより良いプログラマにしてくれるでしょうか?

はい、もちろん、より多くの言語とパラダイムを知ることはあなたをより良いプログラマーにするだけですが、これをまっすぐにします:

優れたプログラマーになるための単一のツール、単一の本、単一のプログラミングパラダイムはありません。

さまざまなパラダイムでさまざまなプログラミング言語を学ぶことは間違いなく優れたプログラマーになるのに役立ちます。さまざまなアプローチで問題を解決することを学ぶことは、論理的思考にも大いに役立ちます。

優れたプログラマーになることは、言語に関することではなく、あらゆる言語で問題を解決する能力を持つことです。そして、あなたがその言語を知らないとき、その言語を素早く学び、それを効果的に使用する能力。

あなたの考え方がグローバルになればなるほど、より良い開発者になると思います。

たとえば、コードに有用なコメントを追加したり、コードの可読性や保守性に注意したりできます。細部に注意してください。入力する前に考えてください!デザインパターンについて学びます。グッドプラクティスに従ってください。

開示:これは私のブログからのものであるため、最悪の種類の恥知らずな広告です


4
LISPやHaskellを有能なレベルまで学んだことがありますか?
ジミー・ホッファ

10
どちらの言語もほとんど知らない人からこれを聞くのは少し不誠実です。今必要なツールではないと主張しますが、それらが何のためのツールなのかわかりません。どうやってこれを知ることができますか?また、LISPはリレーショナルデータ分析でのみ有用なSQL派生物であり、HaskellはRegexpの厳密なサブセットであることがわかっている限り、彼らに何を学ぶか、何を学ばないかをどのようにアドバイスできますか。
ジミー・ホッファ

10
これは本当に質問に答えません。あなたは、知らない2つの言語についての質問に漠然と一般的な答えを与えるという印象的な偉業に成功しました:/
Andres F.

2
-1これは、Common LispとHaskellがまさにあなたに教えることを漠然と踊っているからです。例:コードとしてのデータデータ、純度、参照透過性、単項抽象化、関数型プログラミング、言語指向プログラミング、型指定プログラミングなどなど
jozefg

3
/申し訳ありません:さらに、私はあなたがその質問に答えることができるとは思わないのいずれかの言語を知らない
jozefg

9

普段運用しているパラダイムの外にある言語を学習すると、日々の代替ソリューションに心を開き、選択した言語の一部の機能をよりよく理解するのに役立ちます。それらの言語から学んだ教訓を日常の状況に適用できない限り、それらの言語を知っているだけでは優れたプログラマーにはなりません。

そうは言っても、言語に限定されません。これまでに見たり使用したことのないさまざまなデータ構造を調べると、知識の範囲を広げることができるので、次回問題が発生したときにもう1つの解決策があります。

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