Haskell
Richard Bird、山下伸夫(訳):「関数プログラミング入門 ―Haskellで学ぶ原理と技法―」、オーム社、ISBN 978-4274068966 (2012年10月26日)。
Richard Bird、山下伸夫 (訳):「Haskellによる関数プログラミングの思考法」、KADOKAWA、 ISBN 978-4048930536(2017年2月27日)。
重城良国:「Haskell 教養としての関数型プログラミング」、秀和システム、ISBN 978-4798048062(2017年4月15日)。
Will Kurt、株式会社クイープ (監訳):「入門Haskellプログラミング」、翔泳社、ISBN 978-4798158662(2019年7月31日)。
Grahum Hutton、山本和彦 (訳):「プログラミングHaskell 第2版」、ラムダノート、ISBN 978-4908686078(2019年8月2日)。
本間雅洋、類地孝介、逢坂時響:「Haskell入門 関数型プログラミング言語の基礎と実践」、技術評論社、ISBN 978-4774192376(2017年9月27日)。
引数 f を伴う高階関数で表現された単純な逆ポーランド記法評価器が、パターンマッチングと型クラス Read を用いた where 節で定義されている。
空リストを初期状態とし、f を使って一語ずつ文字列を解釈していく。f は、注目している語が演算子ならばその演算を実行し、それ以外ならば浮動小数点として計算スタックに積んでいる。
次はフィボナッチ数列のリストである。ある値nに対するfib(n)は一回しか計算しないようになっており、その点ではナイーブなフィボナッチと異なる効率の良いコードとなっている。
無限リストは 余再帰(リストの後ろの値は要求があったときに 0 と 1 の二つの初期要素から開始され算出される)によって実現される。このような定義は遅延評価の実例で、Haskell プログラミングでも重要な部分である。
ただし、フィボナッチ数列の生成の場合は、ある要素の値が必要であれば、その要素より前にある要素の値は全て必要である。従って、遅延させた上で結局は後から全てその値を求めることになり、むしろ無駄であるので、この場合は遅延させない組込関数seqを使用したほうが効率は良くなり、fib 1000000 といったような値を計算するような場合には差が見えてくる。あるいはリストの先に出る値から順番に計算させるとそのほうが速い、といったことが起きる。
Haskell の型名は先頭が大文字でなければならない。標準で存在する単純なデータ型としては、Bool(真偽値)型、Int(整数)型、Float(単精度浮動小数点数)型、Char(文字)型、String(文字列)型などが予め定義されている。任意の式の型を定義するには、式と型の間に :: 記号をおく。また、変数などのシンボルを定義する際に変数名を式に指定して書くことで、その変数の型を指定することができる。例えば、次は円周率およびネイピア数を定数として定義し、さらにその型も浮動小数点型として指定している。
関数の型は、各引数の間を -> 記号で区切って表記する。関数は引数をひとつ適用するたびに、その型は -> で区切られたうちの一番左が消えた型となると考えればよい。例えば、ふたつの整数を引数にとりその最大公約数を返す関数 gcd の型は次のように定義される。
型変数を使い、型を抽象化することもできる。これは C++ のテンプレートや Java のジェネリクスに相当するが、様々な種(型の型)に適用できるためより柔軟である。例えば、a 型の値をとり、それをそのまま返す恒等関数 id を型の指定とともに定義すると以下のようになる。ここで任意の型を示す型名 a が定義に使われているが、このように先頭が小文字で始まっている型名は具体的な型名ではなく型変数である。この関数はあらゆる型の値を引数にとることができる。
また、データ型はパラメータとして型変数を持つことができる。例えば、スタックやハッシュテーブルなどのデータ型は、その要素の型を型変数として定義する。ハッシュテーブルを実装するデータ型 HashMap :: * -> * -> * があり、キーに文字列(String)、値に整数(Int)を持つハッシュテーブル hashtable の型は次のようになる。
Haskell は他のプログラミング言語には見られない多くの先進的機能を持っているが、これらの機能のいくつかは言語を複雑にしすぎており、理解が困難であると批判されてきた。とりわけ、関数型プログラミング言語と主流でないプログラミング言語に対する批判は Haskell にもあてはまる。加えて、Haskell の潔癖さとその理論中心の起源に起因する不満がある。
2002年に Jan-Willem Maessen、2003年にサイモン・ペイトン・ジョーンズが遅延評価に関連するこの問題を議論し、その上でこの理論的動機を認識した。彼らは実行時のオーバーヘッドの悪化に加え、遅延はコードのパフォーマンスの推察をより困難にすると言及した。
2003年に Bastiaan Heeren と Daan Leijen、Arjan van IJzendoorn は Haskell の学習者にとってのつまづきに気がついた。これを解決するために、彼らは Helium と呼ばれる新たなインタプリタを開発し、この中でいくつかの型クラスのサポートを取り除き、Haskell の機能の一般化を制限することによってエラーメッセージのユーザ親和性を改善した。