web-dev-qa-db-ja.com

Haskellの後に学ぶべき言語は?

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

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

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

回答の重み付け:もちろん、これらは単なるメモです。整形式の回答をいただいたすべての人に返信したいと思います。あなたはとても役に立ちました。

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

2)LISP(Common LISP、Scheme、Clojure)を非常に好む人。私が収集したものから、Common LISPとSchemeの両方に優れた導入資料(On LISPおよびThe Reasoned Schemer[〜#〜] sicp [〜#〜])。 [〜#〜] sicp [〜#〜]の内容により、Schemeに傾くようになります。特に、Scheme through[〜#〜] sicp [〜#〜]は、異なる評価戦略、遅延の実装、および継続、インタプリタ、記号計算などのトピックに焦点を当てます。最後に、他の人が指摘したように、LISPのコード/データの扱いはまったく新しいものになります。したがって、私はオプション(2)であるLISPに大きく傾いています。

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

4)主流の言語のうち、Pythonが最も興味深いように見えます。TimYatesは言語を非常に魅力的に聞こえます。どうやら、Python CS専攻なので、概念的に豊富であるか、学習しやすいので、さらに調査する必要があります。

あなたの推薦をありがとう! LISP(Scheme、Clojure)、Prolog、またはCoqやAgdaのようなプルーフアシスタントが推奨される主な言語のようです。

85
danportin

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

強力な型システム。 (...)また、私のプログラムの正確さについて非公式に推論するのも簡単になります。私は効率ではなく正確さを気にしています。

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

ここで移行が少し楽すぎているのではないかと思います。非常に厳密な型システムと純粋に関数型のスタイルはHaskellの特徴であり、主流のプログラミング言語に似ているほとんどすべてのものは、少なくともそのうちの1つで妥協する必要があります。それで、それを念頭に置いて、Haskellについてあなたが好んでいるように見えるもののmostを維持することを目的としたいくつかの広範な提案がありますが、いくつか大きなシフトがあります。

  • 実用性を無視して、「HaskellよりもHaskellを増やす」に進む:Haskellの型システムは、終端処理が行われていないなどの厄介な妥協により、穴がいっぱいです。混乱を取り除き、より強力な機能を追加すると、CoqおよびAgdaのような言語が得られます。ここで、関数の型にはその正しさの証明が含まれています(関数の矢印を読むこともできます) ->論理的な意味合いで!)これらの言語は、数学的証明や非常に高い正確性要件を持つプログラムに使用されてきました。 Coqはおそらくスタイルの最も有名な言語ですが、AgdaはよりHaskellに似た雰囲気を持っています(Haskell自体で書かれているだけでなく)。

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

  • 少し妥協し、主流に近づきます:Haskellは、MLに大きく影響された言語の幅広いファミリーに分類されますが、too非常に難しい。 Haskellは、タイプからの正確性の保証と機能的なスタイルの使用に関して最も厳しいものの1つです。他のものは、多くの場合、ハイブリッドスタイルであるか、さまざまな理由で実用的な妥協を行っています。 OOPおよび多くの主流の技術プラットフォームへのアクセスを公開したい場合は、JVMでScalaまたは.NETでF# Javaおよび.NETプラットフォームとの容易な相互運用性を提供しながら、Haskellと多くの共通点があります。F#はMicrosoftによって直接サポートされていますが、Windows以外のプラットフォームでのHaskellおよび移植性の問題に比べていくつかの厄介な制限があります。 。Scalaは、Haskellの型システムやJavaのクロスプラットフォームの可能性の多くに直接対応しますが、構文はより重いため、F#が享受する強力なファーストパーティサポートに欠けています。

これらの推奨事項の大部分は他の回答でも言及されていますが、うまくいけば、それらに対する私の理論的根拠がいくつかの啓蒙を提供してくれます。

85
C. A. McCann

私はザットガイになり、あなたが間違ったことを求めていることをお勧めします。

まず、視野を広げたいと言います。次に、希望する言語の種類を説明します。その地平線は、すでにある地平線と非常によく似ています。同じことを何度も学んでも、それほど多くは得られません。

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

Clojure はより最近のものであり、デフォルトでは不変性のようなより多くのHaskellismsと多くの遅延評価がありますが、これはJava仮想マシンに基づいています。 (例えば、JVMは末尾呼び出しの除去をサポートしていないため、再帰は一種のハックです)。

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

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

20
Chuck

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

Twelfやcoqなどのインタラクティブな定理証明システムもあなたの空想を打つかもしれません。

19
sclv

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

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

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

18

主観的な関心以外の制限については触れず、「学ぶことへのやりがい」を強調しました(そうですね、静的型付けの制限は無視します)。異なるパラダイムのいくつかの言語を学ぶことをお勧めします。それぞれの「模範」です。

  • A [〜#〜] lisp [〜#〜] code-as-data/homoiconicityの方言であり、最良ではないにせよ、動的(多かれ少なかれ厳密な)の例であるため関数型プログラミング言語
  • Prologは主要なロジックプログラミング言語として
  • Smalltalk 1つの真のOOP言語(通常は非常に画像中心のアプローチであるため興味深い))
  • 多分ErlangまたはClojure並行/並列/分散プログラミング用に作成された言語に興味がある場合
  • Forthスタック指向プログラミングの場合
  • Haskell厳密な関数型の静的型付き遅延プログラミングの場合)

特にLisp(CLはSchemeほどではない)とProlog(およびHaskell)は再帰を採用しています。

私はこれらの言語の第一人者ではありませんが、ErlangとForthを除いて、それぞれの時間を費やしました。それぞれが異なる角度から問題解決に取り組んでいるので、すべてが私に目を見張るような興味深い学習経験を与えました。

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

11
danlei

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

Clean はHaskellと非常に似ていますが、モナドの代わりに使用される一意性タイピングがあります(より具体的には、IOモナド)。一意性タイピングも興味深い配列を操作するためのもの。

10
yatima2975

スタック指向プログラミング言語 はどうですか? はあなたの高いポイントに当たります。それは:

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

ドブス博士は2008年に猫について 短い記事 を発表しましたが、言語はわずかに変更されました。

10
Corbin March

私は少し遅れていますが、高度な抽象化と一般性のために興味をそそられるいくつかのパラダイムと関連言語について誰も言及していません。

9
MaD70

あなたの大きな基準(静的*タイピング)の1つを満たせなかったにも関わらず、私はPythonについて主張します。ここに、あなたがそれを見てみるべきだと思ういくつかの理由があります。

  • 命令型言語の場合、それは驚くほど機能的です。これは私がそれを学んだときに私を驚かせたものの1つでした。たとえば、 list comprehensions を考えます。ラムダ、ファーストクラスの関数、イテレータ(マップ、フォールド、zipなど)の機能にヒントを得た多くのコンポジションがあります。問題に最も適したパラダイムを選択することができます。
  • 私見、Haskellのように、コードを書くのは美しいです。構文はシンプルでエレガントです。
  • 効率性に細かく焦点を合わせるのではなく、物事を簡単な方法で行うことに重点を置く文化があります。

あなたが他の何かを探しているなら、私は理解します。たとえば、ロジックプログラミングは、他の人が示唆しているように、まさにあなたの路地にあるかもしれません。


*型を宣言したいので、ここでは静的型付けを意味していると思います。厳密には、Python is文字列を数字として勝手に解釈できないため、厳密に型指定された言語。興味深いことに、静的な型付けを可能にするPython派生物があります Boo など。

8
Tim Yates

あなたの説明があれば、OcamlまたはF#

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

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

あなたがあなたの制限をしなかったなら、私はPythonまたはErlang、どちらもあなたの快適ゾーンからあなたを連れて行くでしょう。

8

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

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

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

6
Fred Foo

Factor が適切な選択です。

6
leolao

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

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

5
kaleidic

[〜#〜] lisp [〜#〜] を調べ始めることができます。

プロローグもクールな言語です。

5
user454497

素晴らしい質問です。私は最近、Haskellを完全に楽しんで数か月を過ごした後、自分自身に質問していますが、私の背景は非常に異なります(有機化学)。

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

私はPythonとRuby)の間で変動しています。今日、2つの実用的な主力のスクリプト言語(ミュール?)ここでRubyist/Pythonistの議論を始めることはありませんが、この質問に対する私の個人的な実用的な答えは次のとおりです。

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

0
jdo

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

0
Angkor Wat