このガイドは、絶対的な初心者から専門家まで、Haskellでのスキルレベルに基づいて注文します。このプロセスには数か月(数年)かかるため、かなり時間がかかることに注意してください。
全くの初心者
第一に、Haskellは十分なスキルがあれば何でもできます。これは非常に高速で(私の経験ではCおよびC ++の背後にあります)、シミュレーションからサーバー、GUI、およびWebアプリケーションまで、あらゆる用途に使用できます。
ただし、Haskellの初心者向けには、他の問題よりも書きやすい問題がいくつかあります。数学的問題とリスト処理プログラムは、Haskellの最も基本的な知識を書くだけでよいので、これに適した候補です。
まず、ハスケルの非常に基本を学ぶにはいくつかの良いガイドがある幸せは、Haskellのチュートリアルを学ぶとの最初の6章あなたにハスケルを学びます。これらを読みながら、あなたが知っていることで簡単な問題を解決することも非常に良い考えです。
もう1つの優れたリソースは、第一原理からのHaskellプログラミングと、Haskellでのプログラミングです。どちらも各章の演習が付属しているため、最後の数ページで学んだ内容と一致する小さな単純な問題があります。
試す問題の良いリストは、haskell 99の問題のページです。これらは非常に基本的なものから始まり、次第に難しくなります。再帰や高次関数のスキルを練習できるので、これらの多くを実行することは非常に良い練習です。ランダム性を必要とする問題はスキップすることをお勧めします。これは、Haskellでは少し難しいためです。QuickCheckを使用してソリューションをテストする場合は、このSOの質問を確認してください(下の「中間」を参照)。
それらのいくつかを実行したら、プロジェクトオイラー問題のいくつかを実行することに進むことができます。これらは、何人の人がそれらを完了したかによって並べ替えられており、これは難易度のかなり良い指標です。これらは以前の問題よりもロジックとHaskellをテストしますが、最初のいくつかはまだ実行できるはずです。これらの問題に対するHaskellの大きな利点は、整数のサイズに制限がないことです。これらの問題のいくつかを完了するには、Haskellについても学ぶことの第7章と第8章を読むことも役立つでしょう。
初心者
その後、再帰関数と高次関数をかなりうまく扱えるようになるので、実世界の問題をいくつか始めてみるのがよいでしょう。開始するのに非常に適した場所は、Real World Haskellです(オンラインブック、ハードコピーも購入できます)。最初のいくつかの章は、関数型プログラミングをやったことがなく、再帰を使用したことがない人には、あまりにも早く導入しすぎたことがわかりました。ただし、以前の問題を実行することから得ていたであろう慣習があれば、完全に理解できるはずです。
本の問題に取り組むことは、Haskellで抽象化を管理し、再利用可能なコンポーネントを構築する方法を学ぶのに最適な方法です。通常のoo抽象化メソッド(ooクラス)はHaskellに表示されないため、これはオブジェクト指向(oo)プログラミングに慣れている人々にとって重要です(Haskellには型クラスがありますが、ooクラスとはooインターフェースのように非常に異なります)。後の章で使用される多くの新しいアイデアが紹介されているので、章をスキップするのは良い考えではないと思います。
しばらくすると、14章に行きます。恐ろしいモナドの章(dum dum dummmm)。Haskellを学ぶほとんどの人は、概念がいかに抽象的なかにより、モナドを理解するのに苦労しています。モナドが関数型プログラミングにあるのと同じくらい抽象的な他の言語の概念は思いつきません。モナドを使用すると、多くのアイデア(IO操作、失敗する可能性のある計算、解析など)を1つのアイデアに統合できます。モナドの章を読んだ後で本当に理解できなくてもがっかりしないでください。モナドについてのさまざまな説明を読むのが便利だと思いました。それぞれが問題について新しい見方をします。モナドチュートリアルの非常に優れたリストを次に示します。All About Monadsを強くお勧めしますが、他のものも良いです。
また、コンセプトが本当に浸透するまでにはしばらく時間がかかります。これは、使用を通じて発生しますが、時間によっても発生します。私は時々問題で寝ることが何よりも役立つことに気づきます!結局、アイデアがクリックされ、実際には信じられないほど単純な概念を理解するのになぜ苦労したのかと不思議に思うでしょう。これが起こるとき、それは素晴らしいです、そして、それが起こるとき、あなたはHaskellがあなたのお気に入りの命令型プログラミング言語であることに気付くかもしれません:)
Haskellの型システムを完全に理解していることを確認するには、20の中間的なhaskellの演習を解く必要があります。「furry」や「banana」などの関数の楽しい名前を使用した演習は、基本的な関数型プログラミングの概念をまだ理解していない場合に、それらをよく理解するのに役立ちます。矢、ユニコーン、ソーセージ、毛皮で覆われたバナナで覆われたたくさんの紙で夜を過ごすのに最適な方法。
中級
モナドを理解したら、初心者のHaskellプログラマーから中級のhaskellerに移行したと思います。それでは、ここからどこへ行くのでしょうか?私が最初に推奨するのは(モナドを学習していない場合)、リーダー、ライター、ステートなど、さまざまな種類のモナドです。繰り返しますが、現実世界のHaskellとモナドについてのすべては、これを非常にカバーしています。モナド変換を学ぶモナドトレーニングを完了するには、必須です。これらにより、異なるタイプのモナド(ReaderとStateモナドなど)を1つに組み合わせることができます。これは最初は役に立たないように思えるかもしれませんが、しばらく使用した後は、それらなしでどのように生活していたのか不思議に思うでしょう。
これで、必要に応じて、実際のHaskellブックを完成させることができます。モナドがパットダウンしている限り、チャプターをスキップすることは今や本当に重要ではありません。興味のあるものを選択してください。
あなたが今持っている知識があれば、cabalのほとんどのパッケージ(少なくとも文書化されたもの)だけでなく、Haskellに付属するほとんどのライブラリを使用できるはずです。試してみる興味深いライブラリのリストは次のとおりです。
Parsec:プログラムとテキストを解析します。正規表現を使用するよりもはるかに優れています。優れたドキュメントには、実際のHaskellの章もあります。
QuickCheck:とてもクールなテストプログラム。あなたがすることは、常に真でなければならない述語を書くことです(例えばlength (reverse lst) == length lst
)。次に、述語QuickCheckを渡すと、多数のランダムな値(この場合はリスト)が生成され、すべての結果に対して述語が真であることをテストします。オンラインマニュアルもご覧ください。
HUnit:Haskellでのユニットテスト。
gtk2hs:Haskellで最も人気のあるGUIフレームワークで、Haskellでgtkアプリケーションを記述できます。
happstack:HaskellのWeb開発フレームワーク。データベースを使用せず、データ型ストアを使用します。かなり良いドキュメントです(他の一般的なフレームワークはsnapとyesodです)。
また、最終的に学ぶ必要のある多くの概念(モナド概念など)があります。これは、モナドを初めて学ぶよりも簡単です。あなたの脳は、関与する抽象化のレベルを扱うことに慣れているからです。これらの高レベルの概念とそれらがどのように適合するかについて学ぶための非常に優れた概要は、Typeclassopediaです。
適用:モナドのようなインターフェイスですが、それほど強力ではありません。すべてのモナドは適用可能ですが、その逆はありません。適用可能でモナドではないタイプがいくつかあるため、これは便利です。また、多くの場合、Applicative関数を使用して記述されたコードは、Monad関数を使用して同等のコードを記述するよりも構成可能です。参照ファンクタ、ApplicativeのファンクタとモノイドからはあなたのHaskellのガイドを学びます。
折り畳み式、Traversableの:型クラスリストの操作の抽象多く、これと同じ機能が他のコンテナ型に適用することができています。haskell wikiの説明も参照してください。
モノイド:Aモノイドは表記、ゼロ(又はmempty)値、及び動作を有するタイプであり<>
、2つのモノイドを結合し、そのようにx <> mempty = mempty <> x = x
とx <> (y <> z) = (x <> y) <> z
。これらは、アイデンティティおよび関連性の法則と呼ばれます。多くのタイプは、数値などのモノイドで、とmempty = 0
を使用し<> = +
ます。これは多くの状況で役立ちます。
矢印:矢印は、入力を受け取って出力を返す計算を表す方法です。関数は最も基本的なタイプの矢印ですが、他にも多くのタイプがあります。このライブラリには、矢印を操作するための非常に便利な関数も多数あります。これらは、単純な古いHaskell関数でのみ使用した場合でも非常に便利です。
配列:Haskellのさまざまな可変/不変の配列。
STモナド:モナドの外では純粋なまま、非常に高速に実行される変更可能な状態でコードを記述できます。詳細については、リンクを参照してください。
FRP:関数型リアクティブプログラミング。イベント、トリガー、入力、出力(GUIなど)を処理する新しい実験的な方法でコードを記述します。私はこれについてはあまり知りません。Paul Hudakのヤンパについての話は良いスタートです。
あなたが見ておくべき新しい言語機能がたくさんあります。私はそれらをリストアップします、あなたはグーグル、haskell wikibook、haskellwiki.orgサイトとghcドキュメンテーションからそれらに関する多くの情報を見つけることができます。
- マルチパラメータタイプのクラス/機能の依存関係
- タイプファミリー
- 実存的に定量化されたタイプ
- ファントムタイプ
- ガッツ
- その他...
Haskellの多くはカテゴリ理論に基づいているので、それを調べたいと思うかもしれません。良い出発点は、コンピュータサイエンティストのカテゴリ理論です。もし本を買いたくないなら、著者の関連記事も素晴らしいです。
最後に、さまざまなHaskellツールについて詳しく学びたいと思います。これらには以下が含まれます:
これらのすべての新しいライブラリと概念を学びながら、Haskellで中規模のプロジェクトを書くことは非常に役立ちます。どんなものでもかまいません(小さなゲーム、データアナライザ、ウェブサイト、コンパイラなど)。これに取り組むことで、今学んでいる多くのことを適用することができます。あなたはこのレベルで年齢を保ちます(これが私がいるところです)。
専門家
この段階に達するには数年かかります(2009年からこんにちは!)。ここから、phd論文、新しいghc拡張機能を書き始め、新しい抽象化を思い付くようになると思います。
困ったときは
最後に、学習のどの段階でも、情報を入手するための複数の場所があります。これらは:
- #haskell ircチャンネル
- メーリングリスト。これらは行われる議論を読むためだけにサインアップする価値があります-いくつかは非常に興味深いです。
- haskell.orgホームページにリストされている他の場所
結論
まあ、これは予想よりも長くなりました...とにかく、Haskellに習熟することは非常に良い考えだと思います。時間がかかりますが、それは主に新しい考え方を学んでいるからです。これは、Javaを学習した後にRubyを学習するのではなく、Cを学習した後にJavaを学習するのと同じです。