Haskell
2行目では Haskell の重要な機能であるパターンマッチングに頼っている。関数の引数が 0であれば、これは 1 を返す。その他の場合は3行目が試される。これは再帰的な呼び出しで、nが0に達するまで繰り返し関数が実行される。
ガードは階乗が定義されない負の値から3行目を保護している。このガードが無ければこの関数は0の終端条件に達することなく、再帰してすべての負の値を経由してしまう。実際、このパターンマッチングは完全ではない。もし関数facに負の整数が引数として渡されると、このプログラムは実行時エラーとともに落ちるであろう。fac _ = error "negative value"のように定義を追加すれば適切なエラーメッセージを出力することができる。
引数 f を伴う高階関数で表現された単純な逆ポーランド記法評価器が、パターンマッチングと型クラス Read を用いた where 節で定義されている。
空リストを初期状態とし、f を使って一語ずつ文字列を解釈していく。f は、注目している語が演算子ならばその演算を実行し、それ以外ならば浮動小数点として計算スタックに積んでいる。
次はフィボナッチ数列のリストである。ある値nに対するfib(n)は一回しか計算しないようになっており、その点ではナイーブなフィボナッチと異なる効率の良いコードとなっている。
無限リストは 余再帰(リストの後ろの値は要求があったときに 0 と 1 の二つの初期要素から開始され算出される)によって実現される。このような定義は遅延評価の実例で、Haskell プログラミングでも重要な部分である。
ただし、フィボナッチ数列の生成の場合は、ある要素の値が必要であれば、その要素より前にある要素の値は全て必要である。従って、遅延させた上で結局は後から全てその値を求めることになり、むしろ無駄であるので、この場合は遅延させない組込関数seqを使用したほうが効率は良くなり、fib 1000000 といったような値を計算するような場合には差が見えてくる。あるいはリストの先に出る値から順番に計算させるとそのほうが速い、といったことが起きる。(さらに、フィボナッチ数はnに対して2nと大きな値になるので、そのようなBigIntegerの加算のコストも掛かり、以前にこの場所に書かれていたような「線形時間でのフィボナッチ数列の生成」は、大きい値では不可能である)
どのように評価が進行するかの例示のために、次は6つの要素の計算の後の fibs と tail fibs の値と、どのようにzipWith (+) が4つの要素を生成し、次の値を生成し続けるかを図示したものである。
次はGHCで使える言語拡張で、リスト内包表記を並列的な生成を記述できるよう拡張するParallelListCompを用いて書いた同様の式である。(GHCの拡張は特別なコマンドラインフラグ、またはLANGUAGEプラグマによって有効にしなければならない。詳しくはGHCのマニュアルを参照のこと)
先に見た階乗の定義は、次のように関数の列を内包表記で生成して書く事もできる。
特に簡潔に書ける例として、ハミング数が順番に並ぶリストを返す以下のような関数がある。
上に示されたさまざまな fibs の定義のように、これはオンデマンドに数のリストを実現するために無限リストを使っており、1 という先頭要素から後続の要素を生成している。
ここでは、後続要素の構築関数は where 節内の記号 # で表現された中置演算子で定義されている。
各|は、等号の前半の条件部分と、後半の定義部分からなるガード節を構成する。
parsec は Haskell で書かれたパーサコンビネータである。パーサの一種であるがコンパイラコンパイラとは異なり、Parsec はパーサのソースコードを出力するのではなく、純粋に Haskell の関数としてパーサを構成する。yacc のようにプログラミング言語と異なる言語を新たに習得する必要がなく、高速でかつ堅牢で、型安全で、演算子の結合性や優先順位を考慮したパーサを自動的に構成したり、動的にパーサを変更することすらできる。
派生として、大幅に高速なパースが可能なattoparsec、高機能でより洗練されたtrifectaがある。
Template Haskell は Haskell のメタプログラミングを可能にする拡張である。Haskell ソースコードの構文木を直接 Haskell から操作することができ、C、C++ のマクロやテンプレートを上回る極めて柔軟なプログラミングを行うことができる。
QuickCheck はデータ駆動型のテストを行うモジュールである。自動的にテストデータを作成してプログラムの正当性をテストすることができる。
lensはアクセサの概念を一般化するライブラリであり、様々なデータ構造に対して共通のインタフェースを与える。Getter、Setterは一つの関数として表現されており、それらを合成することもできる。JSONやXMLや、JSONやXML以外の処理にも応用できる。
Haskell は他のプログラミング言語には見られない多くの先進的機能を持っているが、これらの機能のいくつかは言語を複雑にしすぎており、理解が困難であると批判されてきた。とりわけ、関数型プログラミング言語と主流でないプログラミング言語に対する批判は Haskell にもあてはまる。加えて、Haskell の潔癖さとその理論中心の起源に起因する不満がある。
2002年に Jan-Willem Maessen、2003年にサイモン・ペイトン・ジョーンズが遅延評価に関連するこの問題を議論し、その上でこの理論的動機を認識した。彼らは実行時のオーバーヘッドの悪化に加え、遅延はコードのパフォーマンスの推察をより困難にすると言及した。
2003年に Bastiaan Heeren と Daan Leijen、Arjan van IJzendoorn は Haskell の学習者にとってのつまづきに気がついた。これを解決するために、彼らは Helium と呼ばれる新たなインタプリタを開発し、この中でいくつかの型クラスのサポートを取り除き、Haskell の機能の一般化を制限することによってエラーメッセージのユーザ親和性を改善した。
以下は Haskell 98 仕様を完全に満たす、または仕様に非常に近く、オープンソースライセンスの下で配布されているものである。ここには現在のところ商用のHaskell実装は含まれない。
The Glasgow Haskell Compiler は異なる複数のアーキテクチャのネイティブコードにコンパイルできるほか、C言語にコンパイルすることもできる。おそらくGHCは最も知られた Haskell コンパイラで、現在のところGHCのみで動く言語拡張が実装されており、かなり便利ないくつかのライブラリはGHCのみで動作する(たとえは OpenGL のバインディングなど)。
初期(Haskell 1.2)の仕様をベースとした、等式推論に向いた方言およびインタプリタの実装。当時の Haskell より Miranda に似た構文、標準の機能をいくつか満たさない、逆に標準にないいくつかの機能の追加、などの特徴があった。マーク・ジョーンズにより開発された。その役割の多くは Hugs に譲られた。Hugs の「g」は Gofer に由来する。
これは別のネイティブコード Haskell コンパイラ。
これは新しい Haskell の方言である。開発の際の焦点は、明瞭なエラーメッセージを提供し学習を容易にすることである。Heliumは型クラスをサポートせず、多くのHaskellプログラムとは互換性のない実装である。
これはバイトコードインタプリタである。これは速いプログラム編集とそれなりの実行スピードを提供する。これは単純なグラフィックスライブラリを含む。多くの人が Haskell の基本を学ぶのによいが、これはオモチャ的な実装であるということではない。これは最も可搬で軽量な Haskell 実装である。
これは新しいプログラム変換の研究用としてのみならず、スピードと生成されるプログラムの効率を重視した John Meacham によって書かれた Haskell コンパイラである。
これは別のバイトコードコンパイラであるが、そのバイトコードは Hugs より顕著に速く走る。Nhc98は省メモリ使用に焦点を絞っており、古いマシンや遅いマシンにはとりわけよい選択肢となる。
これはnhc98の派生物で、単純かつ可搬で効率的、integrating Hat のサポートを目標とする。
Darcs - 分散バージョン管理システム。
Monadius - グラディウス・クローンのシューティングゲーム。
Pandoc - Markdownなどを変換するドキュメント・コンバータ。
xmonad - X Window Systemのウィンドウマネージャ。
Yesod - Webアプリケーションフレームワーク。
向井淳:「入門Haskell―はじめて学ぶ関数型言語」、毎日コミュニケーションズ、 ISBN 978-4839919627(2006年3月1日)。
青木 峰郎, 山下 伸夫 (監修):「ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門」、 ソフトバンククリエイティブ、ISBN 978-4797336023(2006年6月1日)。
Grahum Hutton、山本和彦 (訳):「プログラミングHaskell」、オーム社、ISBN 978-4274067815(2009年11月11日)※第2版が2019年に出版。
Miran Lipovača、田中英行 (訳), 村主崇行 (訳):「すごいHaskellたのしく学ぼう!」、オーム社、ISBN 978-4274068850(2012年5月23日)。
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日)。