数日間、私はHaskellの関数型プログラミングパラダイムに頭を包むことを試みました。私はチュートリアルを読み、スクリーンキャストを見ることによってこれを行いましたが、実際には何も固執しないようです。さて、さまざまな命令型/オブジェクト指向言語(C、Java、PHPなど)を学ぶ上では、演習は私にとって良い方法です。しかし、Haskellがどんな能力を持っているのか私には本当にわからないし、利用する新しい概念がたくさんあるので、どこから始めればいいのかわかりません。
だから、Haskellをどのように学びましたか?何があなたを本当に「氷を壊した」のですか?また、演習を開始するための良いアイデアはありますか?
私はこのガイドをあなたがHaskellで持っているスキルのレベルで、絶対的な初心者から上級者まで順番に並べます。このプロセスには何ヶ月も(数年)かかるので、かなり長いことに注意してください。
初心者
第一に、Haskellは十分なスキルを持ち、あらゆることが可能です。これは非常に高速で(私の経験ではCとC++のみの背後にあります)、シミュレーションからサーバー、guis、そしてWebアプリケーションまで、あらゆる用途に使用できます。
しかし、Haskellの初心者にとって他のものよりも書きやすい問題がいくつかあります。数学的な問題やリスト処理プログラムは、最も基本的なHaskellの知識を書くことができるようにするためだけに必要なので、これには良い候補です。
まず、Haskellの基本を学ぶためのよい手引きは happy learn haskellチュートリアル と learnの最初の6章はhaskell です。これらを読みながら、あなたが知っていることで単純な問題も解決することはとても良い考えです。
他の2つの良いリソースは、最初の原則による Haskell Programming と、Haskellでの Programming です。どちらも各章の演習が付属しているので、最後の数ページで学んだことと一致する小さな簡単な問題があります。
試すべき問題の良いリストは haskell 99問題ページ です。これらは非常に基本的なものから始まり、あなたが上に行くにつれて難しくなります。それはあなたが再帰と高階関数であなたのスキルを練習させるのでそれはそれらの多くをすることは非常に良い習慣です。ランダム性が必要な問題はHaskellではもう少し難しいので、スキップすることをお勧めします。 QuickCheckでソリューションをテストしたい場合は、 this SO question をチェックしてください(下記の中級を参照)。
あなたがそれらのいくつかをしたら、 Project Euler 問題のいくつかをすることに進むことができます。これらは、何人の人がそれらを完成させたかによって分類されており、これはかなり困難を示しています。これらは以前の問題よりもあなたのロジックとHaskellをテストします、しかしあなたはまだ最初のいくつかをすることができるはずです。 Haskellがこれらの問題に対して持っている大きな利点は、整数のサイズが制限されていないことです。これらの問題のいくつかを完成させるために、それがあなたにHaskellを同様に学ぶという7と8章を読ませることは役に立つでしょう。
初心者
その後は、再帰や高階関数をかなりうまく扱えるようになるはずです。そのため、実世界の問題をもう少し始めるのに適した時期です。始めるのに非常に良い場所は Real World Haskell です(オンラインブック、ハードコピーを購入することもできます)。私は最初の数章があまりにも早く紹介されたことがあるのを発見しました。しかし、これまでの問題を解決することで得られたはずの慣例で、それは完全に理解できるはずです。
この本の中の問題を解決することは、Haskellで抽象化を管理し再利用可能なコンポーネントを構築する方法を学ぶための素晴らしい方法です。これは、オブジェクト指向(oo)プログラミングに慣れている人にとっては不可欠です。通常のoo抽象化メソッド(ooクラス)はHaskellには現れないからです(Haskellは型クラスを持ちますが、ooインターフェースとはまったく異なります) )それぞれが後の章で使われるたくさんの新しいアイデアを紹介するので、私はそれが章をスキップするのは良い考えではないと思います。
しばらくすると第14章、恐ろしいモナドの章(dum dum dummmm)に行きます。 Haskellを学ぶほとんどすべての人は、その概念が抽象的であるためにモナドを理解するのが困難です。私は、モナドが関数型プログラミングの中にあるような抽象的な概念を他の言語で考えることはできません。モナドでは、(IO操作、失敗する可能性のある計算、解析など)さまざまなアイデアを1つのアイデアにまとめることができます。ですから、モナドの章を読んだ後にあなたが本当にそれらを理解していなくても落胆しないでください。私はモナドのさまざまな説明を読むのが便利だと思いました。それぞれが問題について新しい見方をします。これは非常に良い のモナドチュートリアルのリストです 。私は All About Monads を強くお勧めしますが、他のものも良いです。
また、概念が本当に反映されるまでにはしばらく時間がかかります。これは使用によってもたらされますが、時間を通じてももたらされます。私は時々問題で眠ることが何よりも役に立つのを見つけます!最終的には、アイデアがクリックされ、実際には信じられないほど単純な概念を理解するのに苦労したのはなぜだろうか。これが起こるとき、そしてそれが起こるとき、あなたはHaskellがあなたのお気に入りの命令型プログラミング言語であると思うかもしれません:)
あなたがHaskell型システムを完全に理解していることを確かめるために、あなたは 20中間ハスケル演習 を解くように試みるべきです。 「毛皮のような」や「バナナ」のような楽しい名前の関数を使った練習問題で、まだ基本的な関数型プログラミングの概念を理解していない場合は、それらをよく理解するのに役立ちます。矢印、ユニコーン、ソーセージ、毛皮のようなバナナで覆われたたくさんの書類で夜を過ごすのにぴったりの方法です。
中級
モナドを理解したら、初心者のHaskellプログラマーから中級ハスケラーに移行したと思います。それで、ここからどこへ行くべきですか?私がお勧めする最初のことは(あなたがまだモナドを学ぶことからそれらを学んでいないならば)、Reader、Writer、Stateなどの様々なタイプのモナドです。繰り返しますが、現実世界のHaskellとAll about monadはこれについて非常によく説明しています。モナドの変圧器について学ぶあなたのモナドの訓練を完了することは必須です。これにより、さまざまな種類のモナド(リーダーモナドや州モナドなど)を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:Monadsのようなインターフェースですが、それほど強力ではありません。すべてのモナドはApplicativeですが、その逆ではありません。 ApplicativeであるがMonadではないタイプがいくつかあるので、これは役に立ちます。また、Applicative関数を使用して記述されたコードは、Monad関数を使用して同等のコードを記述するよりも多くの場合、合成可能です。 haskellガイドについて学ぶことから Functors、Applicative FunctorsとMonoids を見てください。
Foldable 、 Traversable :リストの操作の多くを抽象化する型クラスです。これにより、同じ関数を他のコンテナタイプにも適用できます。 haskell wikiの説明 も参照してください。
Monoid :Monoidは、ゼロ(またはmempty)値を持つ型で、<>
とx <> (y <> z) = (x <> y) <> z
のように、2つのMonoidを結合するx <> mempty = mempty <> x = x
と表記されます。これらは、アイデンティティおよび連想法と呼ばれます。多くの型は、数字などのモノイドで、mempty = 0
と<> = +
です。これは多くの状況で役に立ちます。
Arrows :矢印は、入力を受け取り出力を返す計算を表す方法です。関数は最も基本的な種類の矢印ですが、他にも多くの種類があります。このライブラリには、矢印を操作するための非常に便利な関数もたくさんあります - それらは、普通の古いHaskell関数と共に使用しただけでも非常に便利です。
Arrays :Haskellのさまざまな可変/不変の配列。
ST Monad :モナドの外側では純粋なままで、非常に速く実行される可変状態でコードを書くことができます。詳細はリンクを見てください。
FRP:Functional Reactive Programming、イベント、トリガー、入力および出力(guiなど)を処理する新しい実験的コード作成方法。私はこれについてあまり知りません。 Paul Hudakのyampa に関する話は良いスタートです。
あなたが見るべきである多くの新しい言語機能があります。私はそれらをリストアップします、あなたはグーグル、 haskell wikibook 、haskellwiki.orgサイトおよび ghcドキュメンテーション からそれらに関する多くの情報を見つけることができます。
Haskellの多くは category theory を基にしているので、それを調べたいと思うかもしれません。良い出発点は コンピュータ科学者のためのカテゴリ理論 です。この本を購入したくない場合は、作者の関連 article も優れています。
最後に、さまざまなHaskellツールについてもっと学びたいと思うでしょう。これらが含まれます:
これらすべての新しいライブラリと概念を学びながら、Haskellで中規模のプロジェクトを書くことは非常に役に立ちます。それは何でも構いません(例:小型ゲーム、データアナライザ、ウェブサイト、 compiler )。これに取り組むことはあなたが今学んでいることの多くを適用することを可能にするでしょう。あなたは年齢のためにこのレベルにとどまります(これは私がいるところです)。
エキスパート
このステージにたどり着くまでには何年もかかりますが(2009年からこんにちは)、ここから私はあなたがphd論文、新しいghc拡張を書き始め、そして新しい抽象化を考え出すと思います。
困ったときは
最後に、学習のどの段階でも、情報を取得する場所は複数あります。これらは:
結論
さて、これは思ったより長くなりました…とにかく、Haskellに習熟するのはとても良い考えだと思います。長い時間がかかりますが、それは主にあなたがそうすることによって全く新しい考え方を学んでいるからです。 Javaを習得した後にRubyを習得するのではなく、Cを習得した後にJavaを習うのが好きです。また、Haskellを習得することで、オブジェクト指向プログラミングのスキルが向上したと思います。
私の同僚の中には、{ あなたがHaskellをあなたにとって最高のものになるように学んでください! についての経験が豊富です。
チュートリアルは、命令型プログラミング言語の経験があるが関数型言語でプログラムしたことがない人を対象としています。
そして答えをチェックしなさい here も
これはあなたがオンラインで読むことができるよい本です: Real World Haskell
私がやったHaskellのプログラムのほとんどは、 Project Euler の問題を解決するためのものです。
少し前に私が読んだアドバイスは、あなたが(理論上)解決する方法を知っている単純な問題の標準的なセットを持っているべきであるということでした。
Haskellを使った関数型プログラミングに関するこの13回のエピソードシリーズを見るのを楽しんだ。
C9講演:Dr. Erik Meijer - 関数型プログラミングの基礎: http://channel9.msdn.com/shows/Going+Deep/Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1/ /
他の人の答えを付け加えるために - コーディング時(例えばプロジェクトEuler問題を解決する時)に役立つであろう有用なものが1つあります: Hoogle 。コマンドラインインターフェイスまたは Webインターフェイス のいずれかを使用できます。
Haskellプラットフォームをインストールした後は必ずcabal install hoogle
を実行してください。
Googleの使用例
あなたはf x = 3 * x + 1
という関数を持っていて、それを(5 :: Int)
に適用し、そしてそれを結果とその結果に適用したいというようにし、そしてそれらの値の無限リストを得ることができます。あなたはあなたを助けるための関数が既に存在しているかもしれないと思います(とはいえあなたのf
のためではありません)。
その関数は(a -> a) -> a -> [a]
を取る場合はf 5
型、5 f
を取る場合はa -> (a -> a) -> [a]
型になります(関数はInt
sだけでなく一般型用であると仮定します)。
$ hoogle "a -> (a -> a) -> [a]"
Prelude iterate :: (a -> a) -> a -> [a]
そう、あなたが必要とする関数は既に存在していて、それはiterate
と呼ばれています。あなたはiterate func 5
でそれを使います!
同じ例の結果は here にあります。
Graham Huttonの Haskellでのプログラミング は簡潔で、かなり徹底しており、Haskellを教えてきた彼の長年の経験は実に見事です。あなたがそこからどこへ行くかにかかわらず、それは私が人々から始めることをお勧めするものです。
特に、第8章( "関数パーサ")はモナドの扱いを始めるのに必要な本当の土台を提供しています。そして、 All About Monads がこれに続きます。 (ただし、この章に関しては、Webサイトの正誤表に注意してください。特別な助けを借りずにdo
フォームを使用することはできません。最初に型クラスについて学び、その問題を自分で解決することをお勧めします。)
これはHaskell初心者にはあまり強調されていませんが、モナドを使うことだけではなく、自分で構築することについてかなり早い時期に学ぶ価値があります。それは難しいことではありません、そしてカスタマイズされたものは多くのタスクをかなり簡単にすることができます。
面白い隠喩を使ってすべてのモナドチュートリアルを読もうとしないでください。彼らはあなたをさらに悪化させるだけです。
#haskell ircチャンネル に参加してそこで質問することをお勧めします。それが私がHaskellを学んだ方法です。上で示唆されたようにあなたがReal World Haskellを通過するならば、あなたの質問に対するリアルタイムの答えは大いに役立つでしょう。 #haskellの賢い人々がたくさんHaskellを面白くて利益のために書いているので、あなたはたくさんの良い入力を得るでしょう。それを試してみてください!
これらは私のお気に入りです
Joeri van Eekelen, et al. | Wikibooks
Published in 2012, 597 pages
B. O'Sullivan, J. Goerzen, D. Stewart | OReilly Media, Inc.
Published in 2008, 710 pages
紹介として Yet Another Haskell Tutorial を追加することをお勧めします。
私を大いに助けてくれ、私が見ることができる限り他の答えで言及されていないもう一つの良い学習リソース(おそらく中級レベル)は、見つけることができるBrent YorgeyのTypeclassopediaです。 The Monad Reader(問題13) に
それはとてもアクセシブルなスタイルで書かれていて、そして他の多くの事柄の中でも特に、以下の入門アドバイスを含みます:
エキスパートのHaskellハッカーの知恵には2つの鍵があります。
型を理解する.
多くの例に精通していることで裏付けされた、各型クラスと他の型クラスとの関係について深い直感を得てください。
The Monad Reader それ自体は関数型プログラマのための絶対的な宝庫です(Haskellプログラマだけでなく)。
私は、Haskellの機能を実例で理解することが、何よりも始めるための最善の方法だと思います。
http://en.wikipedia.org/wiki/Haskell_98_features
これはモナドと矢を含むトリッキーな型クラスです。
http://www.haskell.org/haskellwiki/Typeclassopedia
実社会の問題やより大きなプロジェクトの場合は、次のタグを覚えておいてください:GHC(最も使用されているコンパイラ)、Hackage(libraryDB)、Cabal(構築システム)、darcs(別の構築システム)。
統合システムはあなたの時間を節約することができます: http://hackage.haskell.org/platform/
このシステムのパッケージデータベース: http://hackage.haskell.org/ /
GHCコンパイラのウィキ: http://www.haskell.org/haskellwiki/GHC
Haskell_98_featuresとTypeclassopediaの後、私はあなたがすでに自分でそれらについてのドキュメントを見つけて読むことができると思います
ところで、将来的にはhaskell標準の一部になるかもしれないいくつかのGHCの言語拡張をテストしたいかもしれません。
これはhaskellを学ぶための私の最良の方法です。お役に立てば幸いです。
簡単なプログラムを書いてみてください。
あなたはおそらくさまざまな教科書の中にサンプルタスクを見つけることができます。
Haskell/FPの教科書にこだわることはお勧めしません。計算、文字列操作、ファイルアクセスなど、簡単なことをするようにしてください。
私はダースを解決した後、私は氷を壊した:)
それ以降は、haskellは無限大でそれらの多くがあるので、高度な概念(モナド、矢印、IO、再帰的データ構造)についてたくさん読んでください。
最初に BONUS 'tutorial を読み、次に Real World Haskell(オンラインで無料) を読むことをお勧めします。 #Haskell IRCチャンネル、irc.freenode.com に参加して、質問してください。これらの人々は絶対に初心者に優しく、そして時間をかけて私を大いに助けてくれました。また、ここ[SO]は、理解できないことがある場合に役立ちます。それがクリックされると、落胆しないようにしてください、あなたの心は爆破されます。
BONUSのチュートリアルであなたを準備し、Real World Haskellがもたらすスリル満点のドライブの準備を整えます。私はあなたの幸運を祈ります!
命令型/オブジェクト指向言語の経験しかない場合は、より慣習的な関数型言語を踏み台として使用することをお勧めします。 Haskellは 本当に 違うので、どこにでも行くためにはたくさんの異なる概念を理解する必要があります。最初にMLスタイルの言語(例:F#)に取り組むことをお勧めします。
最初の答えはとても良いものです。エキスパートレベルに到達するために、あなたはエキスパート自身の何人かとPhDをするべきです。
Haskellのページにアクセスすることをお勧めします: http://haskell.org 。そこにはたくさんの資料があり、Haskellコミュニティで承認されたHaskellの最新のものへの参照がたくさんあります。