web-dev-qa-db-ja.com

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

私はLISPとHaskellがそれぞれロジックと関数型プログラミング言語であることを知っていますが、これは正確にはどういう意味ですか?他の言語とどう違うのですか?これらを学ぶことであなたはより良いプログラマーになり、あなたの論理を改善すると聞いたことがあります。これは本当ですか。LISPまたはHaskellを適切なレベルまで学習すると、プログラミングが向上し、あらゆる言語での問題の処理に優れたものになりますか?私は彼らが学ぶ努力の価値があるかどうかを知りたいと思っていました。また、これらの言語はGUIやグラフィックスなどの領域で役立ちますか、それともコンソールアプリケーションでのみ役立ちますか?

42
Logan545

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

それらの言語を設計した人々は、プログラムを書くことが何を意味するかについて一生懸命考えてきました。そしてそれらの言語はそれらの研究の結果です。

そうは言っても、Java=を学ぶことは、あなたをより優れたプログラマーにすることにもなります。そしてCを学ぶことは、異なる哲学を持つ言語を学ぶことから得られます。それから、プログラムがどうあるべきかについてあなた自身の意見を持つことができます。書かれる。

編集

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

舌足らずの発音

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

直接的な結果として、LISP言語では、必要なインターフェイスを定義できます。 Niceの例は、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アクションはトランザクションとして定義され、 haskellプログラムのmain値は、プログラムの実行時に実行されるIOトランザクションです。

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

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

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

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

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

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

安全な道(scalaのような)を取り、非常に複雑な言語になってしまうか、単純な道をたどって制限されたもの(google goジェネリックはリストとマップに限定されます)または安全ではない(ダートジェネリックは常に共変)。

Haskellを使用することにより、純粋性の利点、および純粋なコードの作成方法について主に学びます。

38
Simon Bergot

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

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

舌足らずの発音:

  1. ホモコード。これにより、構造化された自己変更コードが可能になります。
  2. 構文認識マクロ。それらは定型コードの書き換えを可能にします。
  3. プラグマティズム。 CLは、働く専門家によって物事を成し遂げるように設計されています。原則として、ほとんどの関数型言語はそうではありません。
  4. 柔軟性。合理的な速度でさまざまなことを実行できます。
  5. いびき。実世界は乱雑です。実用的なコーディングは、厄介な構造を使用するか、発明する必要があります。一般的なLISPは、物事を成し遂げることができるほど十分に注意深いです。

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

私は手足を出し、一般的なケースでは、構文はプロのソフトウェアワーカーにとって問題ではないはずだと言います。

From: LISPが役立つのはなぜですか?

Haskell:

Haskellはコンピュータープログラミング言語です。特に、それは多態的に静的に型付けされた、遅延した、純粋に関数型の言語であり、他のほとんどのプログラミング言語とはかなり異なります。この言語はHaskell Brooks Curryにちなんで名付けられました。数学ロジックの研究は関数型言語の基礎として機能します。 Haskellはラムダ計算に基づいているため、ロゴとして使用するラムダです。

あなたはそこに の説明を読むことができます関数型vs命令型

差出人: http://www.haskell.org/haskellwiki/Introduction

彼らは私をより良いプログラマーにしてくれますか?

はい、もちろん、より多くの言語とパラダイムを知ることは、あなたをより優れたプログラマーにするだけですが、これを正直に理解してください:

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

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

優れたプログラマであるということは、言語についてではなく、あらゆる言語で問題を解決する能力を持つことです。また、言語がわからない場合でも、その言語をすばやく学習して効果的に使用することができます。

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

たとえば、コードに有用なコメントを追加したり、コードの読みやすさや保守性を気にすることができます。細部に注意してください。入力する前に考えてください。デザインパターンについて学習します。良い習慣に従ってください。

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

15
jsedano

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

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

11
Jetti