Haskellの後に学ぶべき言語は何ですか?[閉まっている]


85

私の最初のプログラミング言語として、Haskellを学ぶことにしました。私は分析哲学を専攻しており、Haskellを使用すると、自然言語解析用のトランスデューサー、定理証明者、通訳など、関心のあるプログラムをすばやく正確に作成できました。プログラミングを始めて2か月半しか経っていませんが、Haskellのセマンティクスと構文は、従来の命令型言語よりもはるかに簡単に習得でき、その構成の大部分に(今は)快適に感じることができました。

Haskellでのプログラミングは魔術のようなものですが、プログラミングの知識を広げたいと思います。学ぶために新しいプログラミング言語を選びたいのですが、任意の言語を選んでドロップして繰り返す時間がありません。それで、私が探している言語のタイプについてのいくつかの規定とともに、ここで質問をするつもりでした。主観的なものもあれば、Haskellからの移行を容易にすることを目的としたものもあります。

  • ストロングタイプシステム。Haskellでのプログラミングの私のお気に入りの部分の1つは、型宣言を書くことです。これは、個々の機能とプログラム全体との関係についての私の考えを構造化するのに役立ちます。また、私のプログラムの正しさについての非公式な推論も容易になります。私は効率ではなく、正確さに関心があります。
  • 反復ではなく再帰に重点を置きます。私はHaskellで反復構造を使用していますが、それらを再帰的に実装しています。ただし、特にコンビネータやマップ、フォールド、バインドなどの高階関数を使用する場合は、複雑な反復手順よりも再帰関数の構造を理解する方がはるかに簡単です。
  • 学ぶことはやりがいがあります。Haskellは働きがいのある言語です。カントを読むのと少し似ています。しかし、数年前のCでの私の経験はそうではありませんでした。私はCを探していません。言語は概念的に興味深いパラダイムを強制する必要がありますが、私の完全に主観的な意見では、Cのようなものはそうではありません。

答えを比較検討する:もちろん、これらは単なるメモです。整形式の回答をいただいた皆様に返信したいと思います。あなたはとても役に立ちました。

1)いくつかの回答は、再帰を強調する強力で静的に型付けされた言語が別の関数型言語を意味することを示しました。私はHaskellと強力に協力し続けたいと思いますが、camccannとlarsmansは、別のそのような言語は「移行を容易にしすぎる」と正しく指摘しました。CamlでHaskellを書くつもりはないので、これらのコメントは非常に役に立ちました!証明アシスタントのうち、CoqとAgdaはどちらも面白そうです。特に、Coqは、建設的論理と形式型理論への確かな紹介を提供します。私は一次述語と様相論理(メンデルソン、エンダートン、ヒンマンの一部)に少し時間を費やしたので、おそらくCoqをとても楽しんでいたでしょう。

2)他の人はLispを強く支持しました(Common Lisp、Scheme、Clojure)。私が集まるところでは、Common LispのとSchemeの両方が(優れた入門資料持つLispのオン推論スキーマーSICPを)。SICPの資料により、私はスキームに傾倒します。特に、Scheme through SICPは、さまざまな評価戦略、怠惰の実装、および継続、インタプリタ、記号計算などのトピックに焦点を当てる機会をカバーします。最後に、他の人が指摘しているように、Lispのコード/データの扱いはまったく新しいものになるでしょう。したがって、私はオプション(2)であるLispに大きく傾いています。

3)第三に、プロローグ。Prologには興味深い資料が豊富にあり、そのプライマリドメインはまさに私が興味を持っているものです。それは単純な構文を持ち、読みやすいです。現時点ではこれ以上コメントすることはできませんが、Prologの概要を読み、いくつかの紹介資料をざっと読んだ後、それは(2)にランク付けされます。そして、Prologのバックトラックは常にHaskellにハッキングされているようです!

4)主流の言語の中で、Pythonが最も興味深いように見えます。Tim Yatesは、言語を非常に魅力的に聞こえるようにします。どうやら、Pythonは1年生のCS専攻に教えられることがよくあります。そのため、概念的に豊富であるか、簡単に習得できます。もっと研究しなければならないでしょう。

お勧めありがとうございます!Lisp(Scheme、Clojure)、Prolog、またはCoqやAgdaのような証明アシスタントが推奨される主な言語のようです。


34
2.5か月では、言語を深く学ぶのに十分な時間ではありません。バブルを破裂させて申し訳ありません。
woot4Moo 2010

20
それは確かに真実です。それが何を意味するにせよ、私がHaskellを「学んだ」ことを意味するつもりはありませんでした。私はその言語を快適に使用できることを意味しました。私は明らかにそれを「学ぶのをやめない」でしょう。
danportin 2010

10
@Michael:効率ではなく正確さのためのコーディングは、私がもっと見たいものです...
Deniz Dogan 2010

24
@ Woot4Moo:ただし、2.5か月は、言語を「快適」にするのに十分な時間です。彼が形式論理学に精通していて、彼の哲学の背景から抽象的な概念を扱っているなら、二重にそうです。この場合、他の言語から習慣を学ぶ必要がないことも役に立ちます。
CA McCann

8
@gnovice:確かに何度も聞かれました。しかし、Haskellで初めて本格的なプログラミング経験をした人に出会ったのはこれが初めてです。時間の矢が逆になっているようなものです。
ムハンマドアルカロウリ2010

回答:


85

プログラミングの知識を広げたいと思います。(...)私が探している言語の種類に関するいくつかの規定とともに、ここで質問をするつもりでした。主観的なものもあれば、Haskellからの移行を容易にすることを目的としたものもあります。

ストロングタイプシステム。(...)それはまた私のプログラムの正しさについての非公式な推論をより簡単にします。私は効率ではなく、正確さに関心があります。

反復ではなく再帰に重点を置きます。(...)

ここでは、移行を少し緩和しすぎている可能性があります。恐れ入ります。非常に厳密な型システムと純粋関数型スタイルはHaskellの特徴であり、主流のプログラミング言語に似ているほとんどすべてのものは、これらの1つで少なくともある程度妥協する必要があります。それで、それを念頭に置いて、Haskellについてあなたが好きだと思われるもののほとんどを保持することを目的としたいくつかの幅広い提案がありますが、いくつかの大きな変化があります。

  • 実用性を無視して、「HaskellよりもHaskellの方が多い」を選択してください。Haskellの型システムは、非終了やその他の厄介な妥協により、穴でいっぱいです。混乱をクリーンアップし、より強力な機能を追加すると、CoqAgdaなどの言語が得られます。この言語では、関数の型にその正しさの証明が含まれています(関数の矢印->を論理的な意味として読み取ることもできます)。これらの言語は、数学的証明や非常に高い精度要件を持つプログラムに使用されてきました。Coqはおそらくこのスタイルの中で最も著名な言語ですが、AgdaはHaskellのような感じがします(Haskell自体で書かれているだけでなく)。

  • タイプを無視して、魔法を追加します。Haskellが魔術である場合、Lispは創造の生の主要な魔法です。Lispファミリ言語(SchemeClojureも含む)は、極端なミニマリズムと組み合わされたほぼ比類のない柔軟性を備えています。言語には基本的に構文がなく、ツリーデータ構造の形式でコードを直接記述します。一部の言語では、Lispでのメタプログラミングは非メタプログラミングよりも簡単です。

  • 少し妥協し、近い主流に移動:Haskellは言語の広範な家族に該当あなたはおそらくなしにシフトする可能性のうち、MLによって大きな影響を受けるあまりにも多くの困難。Haskellは、タイプや関数型スタイルの使用による正確性の保証に関して最も厳しいものの1つであり、他のスタイルはハイブリッドスタイルであるか、さまざまな理由で実用的な妥協をすることがよくあります。OOPにある程度触れて、多くの主流のテクノロジープラットフォームにアクセスしたい場合は、JVM上のScalaまたはF#のいずれかです。on .NETは、Javaおよび.NETプラットフォームとの簡単な相互運用性を提供しながら、Haskellと多くの共通点を持っています。F#はMicrosoftによって直接サポートされていますが、Haskellと比較していくつかの厄介な制限があり、Windows以外のプラットフォームでの移植性の問題があります。Scalaには、Haskellの型システムとJavaのクロスプラットフォームの可能性の多くに直接対応するものがありますが、構文がより重く、F#が享受する強力なファーストパーティのサポートがありません。

それらの推奨事項のほとんどは他の回答でも言及されていますが、うまくいけば、それらの私の理論的根拠がいくつかの啓蒙を提供します。


4
I家族コックAgdaあなたも見ることができチーII
Hynek -Pichi- Vychodil 2010

あなたの意見では、F#の厄介な制限は何でしょうか?暇なときにF#を学んでいる人として、私は知りたいと思っています。
ルーカス

7
@Lucas:大きなものと必要最低限​​のHaskellは、より種類の多いポリモーフィズムと型クラスがないことです。それを超えて、かなりの数のGHC固有の拡張機能がかなり素晴らしいです。決して致命的な欠陥ではありませんが、Haskellに慣れた後は、そのようなものがないのはちょっと不器用だと感じます。... C#1.1を使用して近代的なC#の後ろから行く想像
CAマッキャン

@HyneK:このQi 2言語は一見非常に興味深く、CoqやAdgaよりも柔軟性があります。作者はそれをやめると呼ぶことに決めたようですが。この言語に取り組み続ける動きはありますか?私はすでに半分死んでいる何かを学びたくありません。
アレックス

@Alex:Shenとして継続されているようです:shenlanguage.org
amindfv

20

私はあの男になり、あなたが間違ったことを求めていることを提案します。

まず、視野を広げたいと言います。次に、必要な言語の種類を説明すると、その範囲は、すでに持っている範囲のように信じられないほど聞こえます。同じことを何度も学んでも、あまり得られないでしょう。

Lisp、つまりCommon Lisp、Scheme / Racket、Clojureを学ぶことをお勧めします。これらはすべてデフォルトで動的に型付けされますが、ある種の型ヒントまたはオプションの静的型付けを備えています。ラケットとClojureはおそらくあなたの最善の策です。

Clojureはより最近のものであり、デフォルトでの不変性や多くの遅延評価などのハスケリズムが多くありますが、Java仮想マシンに基づいているため、奇妙な問題がいくつかあります(たとえば、JVMは末尾呼び出しの除去をサポートしていないため、再帰は親切ですハックの)。

ラケットははるかに古いものですが、静的型のサポートや関数型プログラミングへの焦点など、その過程で多くの力を獲得してきました。おそらくラケットを最大限に活用できると思います。

Lispsのマクロシステムは非常に興味深く、他のどこよりもはるかに強力です。それだけでも少なくとも一見の価値があります。


3
ええと、Haskellの観点からは、型ヒントやオプションの静的型付けは、完全に動的な型付けとそれほど変わらないように見えます。それは非常に異なる考え方です。そうは言っても、Lisp-y言語はあらゆる種類の楽しみであり、すべてのプログラマーが少なくともある程度の時間をかけて学習する必要があると思います。
CA McCann

19

あなたの専攻に合うものの観点から、明白な選択は、Prologまたはその派生語のような論理言語のように思えます。論理プログラミングは関数型言語で非常にきれいに行うことができますが(たとえば、The Reasoned Schemerを参照)、論理パラダイムを直接操作することを楽しむことができます。

twelfやcoqなどのインタラクティブな定理証明システムも気に入るかもしれません。


2
強く型付けされた言語に関心があるとおっしゃるときは、型付き高階論理プログラミング言語であるlambdaPrologをお勧めします。コンパイルされた実装の1つはTeyjusです-code.google.com/p/teyjus(開示:私はTeyjusに取り組みました)。
ザックスノー

18

Haskellプログラマーにとって快適な構文を備えた強力な証明アシスタントであるCoqを学ぶことをお勧めします。Coqの優れた点は、Haskellを含む他の関数型言語に抽出できることです。Coqで書かれ、その動作について証明されたプロパティを持ち、Haskellに抽出されたパッケージ(Meldable-Heap)もあります。

Haskellよりも強力なもう1つの人気のある言語は、Agdaです。Agdaは、依存型で入力され、Hackageに依存し、尊敬する人々から尊敬されていることを知っている以外は知りませんが、それは私にとって十分な理由です。

これらのどちらも簡単だとは思いません。しかし、Haskellを知っていて、Haskell型システムよりも強力な言語に移行したい場合は、それらを検討する必要があります。


1
AgdaはHaskellの自然な「次のステップ」のように聞こえます。
デニス・ドアン2010

5
哲学専攻として、彼が形式論理学の経験が豊富な場合、カリーハワードスタイルの証明アシスタントは、ほとんどのベテランプログラマーよりも彼の困惑が少ないかもしれないことも注目に値します!
CA McCann

11

主観的な興味以外の制限については言及せず、「学ぶことへの報酬」を強調しているので(まあ、わかりました、静的な型付けの制限は無視します)、異なるパラダイムのいくつかの言語、できれば次の言語を学ぶことをお勧めしますそれらのそれぞれについて「例示的」です。

  • AのLispのコードとしてデータ/ homoiconicity物のため、彼らは、最高ではない場合、ダイナミックの例(多かれ少なかれ厳格な)関数型プログラミング言語に優れているため、方言
  • 主要な論理プログラミング言語としてのProlog
  • 1つの真のOOP言語としてのSmalltalk(通常は非常に画像中心のアプローチであるため興味深い)
  • 並行/並列/分散プログラミング用に作成された言語に興味がある場合は、ErlangまたはClojureかもしれません
  • フォーススタック指向プログラミングのための
  • (厳密に機能する静的型付き遅延プログラミングのHaskell

特にLisps(CLはSchemeほどではありません)とProlog(およびHaskell)は再帰を受け入れます。

私はこれらの言語の第一人者ではありませんが、アーランとフォースを除いて、それぞれの言語で時間を過ごしました。それぞれが異なる角度から問題解決に取り組むにつれて、それらはすべて私に目を見張るような興味深い学習体験を与えてくれました。 。

ですから、いくつかの言語を試す時間がないという部分を無視したように見えるかもしれませんが、これらの言語のいずれかで費やした時間は無駄にならないので、すべてを見てください。


保護者を巻き込んだErlangの制限に耐えられませんでした;)
gorsky

10

どの程度のスタック指向プログラミング言語はあなたのハイポイントを打ちます。それは:

  • 型推論で静的に型付けされます。
  • ループのような一般的な命令型言語の概念を再考させます。条件付き実行とループは、コンビネータで処理されます
  • やりがいのある-計算のさらに別のモデルを理解するように強制します。問題について考え、分解する別の方法を提供します。

Dobbs博士は、言語が少し変わったものの、2008年にCatに関する短い記事を公開しました。


10

強く(より)型付けされたPrologが必要な場合は、Mercuryが興味深い選択肢です。私は過去にそれに手を出しました、そして私はそれが私に与えた異なる視点が好きでした。また、型システムにモード性(どのパラメーターを解放/固定する必要があるか)と決定論(結果はいくつありますか?)があります。

CleanはHaskellに非常に似ていますが、モナド(より具体的には、IOモナド)の代わりに使用される一意性の型付けがあります。一意性の型付けは、配列の操作にも興味深いことを行います。



8

あなたの大きな基準(静的*型付け)の1つを満たしていないにもかかわらず、私はPythonの主張をするつもりです。これが私があなたがそれを見るべきだと思ういくつかの理由です:

  • 命令型言語の場合、それは驚くほど機能的です。これは私がそれを学んだときに私を驚かせたものの1つでした。リスト内包表記を例にとってみましょう。ラムダ、ファーストクラスの関数、およびイテレーター(マップ、フォールド、ジップなど)に機能的に着想を得た多くのコンポジションがあります。問題に最も適したパラダイムを選択するオプションが提供されます。
  • IMHO、Haskellのように、コーディングするのは美しいです。構文はシンプルでエレガントです。
  • 効率性に細心の注意を払うのではなく、単純な方法で物事を行うことに焦点を当てる文化があります。

あなたが何か他のものを探しているかどうかはわかりますが。たとえば、他の人が示唆しているように、論理プログラミングはあなたの路地のすぐ上にあるかもしれません。


*型を宣言したいので、ここでは静的型付けを意味すると思います。技術的には、Python強く型付けされた言語です。たとえば、文字列を数値として任意に解釈することはできないからです。興味深いことに、Booのように静的型付けを可能にするPython派生物があります。


ただし、強力な型システムは、必ずしも「静的」型を意味するだけではありません。
デニス・ドアン

+1は、larsmansの回答に関する私のコメントも参照してください。ただし、Pythonをかなり機能的なものとして宣伝するように注意してください。例えば、ジェネレータ式は、通常よりも好ましいmapfilterなど、しかし、まだ、発電機や発電機式は遅延評価を知っていて、機能を言った人に馴染みの感じになります。

16
本当に?Pythonは、関数型プログラミングをあまり行っていない人にとっては特に機能的だと思います。私はPythonとHaskellの両方をかなりの量使用してきましたが、Pythonは優れた言語であり、関数型言語からいくつかのものを借りてきましたが、それでも99%必須です。
CA McCann

@camccannその通りです。私の見方は異なります。そのため、これを興味深い代替手段として提供しています。最初に命令型プログラミングを学んだ人として、Pythonを使用すると、関数型手法を適切な場所で使用し、他の意味のある場所では回避できることを感謝しています。私はそれが「機能的」であると主張しているのではなく、それが良い妥協点を作っているというだけです。
Tim Yates

Haskellから学んだ習慣は、母国語として学んだ他の人よりもはるかに優れたPythonプログラマーになることができます。
u0b34a0f6ae

8

Erlangをお勧めします。強い型の言語ではないので、試してみてください。これはプログラミングに対する非常に異なるアプローチであり、強い型付けがThe Best Tool(TM)ではないという問題があることに気付くかもしれません。とにかく、Erlangは静的型検証用のツール(タイパー、ダイアライザー)を提供し、それから利益を得る部分に強い型付けを使用することができます。それはあなたにとって興味深い経験かもしれませんが、準備してください、それは非常に異なる感覚になります。「概念的に興味深いパラダイム」を探しているなら、Erlang、メッセージパッシング、共有の代わりにメモリ分離、配布、OTP、エラー処理、エラー「防止」の代わりにエラー伝播などで見つけることができます。Erlangは現在の経験から遠く離れている可能性がありますが、CとHaskellの経験がある場合は、それでも脳をくすぐります。


8

あなたの説明を踏まえて、OcamlまたはF#をお勧めします

MLファミリーは、一般的に、強力な型システムの点で非常に優れています。パターンマッチングと組み合わせた再帰の強調も明らかです。

私が少し躊躇しているところは、学ぶことやりがいにあります部分です。それらを学ぶことは、間違いなく私にとってやりがいのあることでした。しかし、あなたの制限とあなたが望むもののあなたの説明を考えると、あなたは実際にはHaskellよりもはるかに異なるものを探しているわけではないようです。

もしあなたがあなたの制限をかけなかったら、私はPythonErlangを提案したでしょう、どちらもあなたをあなたの快適ゾーンから連れ出すでしょう。


6

私の経験では、強い型付けと再帰の強調は、別の関数型プログラミング言語を意味します。繰り返しになりますが、Haskellほど「純粋」なものはないことを考えると、それは非常にやりがいのあることではないでしょうか。

他のポスターが示唆しているように、PrologとLisp / Schemeはどちらも動的に型付けされていますが、素晴らしいです。特にSchemeについては、理論的な「味」が強い素晴らしい本がたくさん出版されています。SICPを見てください。これは、多くの一般的なコンピュータサイエンスの知恵(メタサーキュラーインタプリタなど)も伝えます。


4
最初の段落は+1で、質問を読んだときに思ったとおりです。新しいことを学ぶために、Pythonのような最新の命令型言語を提案します。特にOPが慣れているものではないためです(動的型付け、あらゆる場所でのイテレーターなど)。また、メタクラスやジェネレーター(レイジーリストに非常によく似ています)/ジェネレーター式(リスト内包表記+ジェネレーターの一般化として機能します)のような非常にクールな高度な概念もあります。また、内包表記のルールを口述して設定します。

3
@delnan:Haskellにはリスト内包表記もあり、ジェネレーター/イテレーターはHaskellの標準リストタイプを使用してHaskellで簡単に表現できます。したがって、2つの言語の最大の違いは、私の意見では、オブジェクト指向プログラミングと(ほとんどの場合)辞書などの不純なデータ構造です。
デニス・ドアン2010

1
@Deniz Dogan:Pythonでの宣言と適切な字句スコープの欠如を忘れないでください。
フレッドフー


5

Lispを調べ始めることができます。

Prologもクールな言語です。


5

型システムの好みから逸脱することにした場合は、Jプログラミング言語に興味があるかもしれません。機能構成を重視している点で抜群です。Haskellのポイントフリースタイルが好きなら、Jの暗黙の形式はやりがいがあります。特にセマンティクスに関しては、非常に示唆に富むものであることがわかりました。

確かに、それはあなたが望むものについてのあなたの先入観に適合しませんが、それを見てください。それがそこにあることを知っているだけで、発見する価値があります。完全な実装の唯一のソースは、J Software、jsoftware.comです。


0

メインストリームの1つを使用します。利用可能なリソース、スキルの将来の市場性、豊富な開発者エコシステムを考えると、JavaまたはC#のいずれかから始める必要があると思います。


14
Haskellと比較すると、どちらもかなり不完全な言語のIMOです。
missingfaktor

9
HaskellerにJavaへの移行を依頼することは、BillGatesにスラム街への移行を依頼するようなものです。: - /
missingfaktor

1
+1間違いなくあなたを否定する何かを提案するため。JavaとC#は優れたエコシステムを備えており、どちらも本格的な作業に非常に推奨されます。確かなプラスとして、JVMでClojureを使用するとき、またはCLRでF#を使用するときに、Haskell(、JavaおよびC#)の知識を活用できます。
ポンサノ2010

6
@ponzao:うーん、いや、誰かがHaskellからJavaまたはC#に移行することを示唆するのは恐ろしくて残酷です。Scala、F#、およびClojureは、JVM / CLRでの実行と同じ利点を備えた、はるかに優れた言語です。
CA McCann

5
分析哲学にとって、主要なJavaまたはC#は時間の無駄です。
maD70 2010年

0

すばらしい質問です。私の経歴は大きく異なりますが(有機化学)、Haskellを数か月間十分に楽しんだ後、最近自分で質問しています。

あなたのように、Cとその同類は問題外です。

私はPythonとRubyの間で、今日の2つの実用的な主力スクリプト言語(ミュール?)として振動してきました。どちらにも、私を幸せに保つためのいくつかの機能コンポーネントがあります。ここでRubyist / Pythonistの議論を始めることなく、この質問に対する私の個人的な実用的な答えは次のとおりです。

最初に適用する言い訳を得るもの(PythonまたはRuby)を学びます。

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