Haskell は汎用の純粋関数型プログラミング言語で,プログラミング言語設計の分野における最近の革新が多く取入れられている. Haskell が提供するのは,高階関数,非正格の意味論,静的多相型付け,ユーザ定義の代数デー タ型,パターン照合,リスト内包表記,モジュールシステム,モナド I/O システムである. また,さらに次のような豊かなプリミティブデータ型が用意されている. リスト,配列,任意倍長整数,固定倍長整数,浮動小数点数.Haskell は非正格関数型言語に関する長年の研究を凝縮したものであり,また,その頂点に立つものである.
この報告書は Haskell で書かれたプログラムの構文とそのプログラムの意味に対する非形式的抽象意味論を定義するものである.Haskell のプログラムがどのように処理され、解釈され、コンパイルされるかなどといった部分に依存する実装の問題には触れない. ここではとりあげない問題にはプロ グラミング環境の性質や未定義(すなわち,形式的には ⊥ と評価される)プログラムに関するエラーメッセージも含まれる.
この節では Haskell の抽象構文としてと抽象意味論としての構造について説明する. また,そのような構造が報告書の残りの部分の組み立てと,どのように関係しているかについても説明する.
この報告書では Haskell の構文構造をボトムアップに説明していく.
上では言及しなかったが,6章では Haskell に標準で組み込まれている型と型クラスについて,7章で は,Haskellでの I/O 機能(すなわち,Haskell のプログラムはどのようにして外界と交信するか)について議論する. いくつかの章では,プレリュード,具象構文,文芸的プログラミング,導出インスタンスの仕様,それにほとんどの Haskell コンパイラでサポートされているプラグマについても説明する.
この報告書では,Haskell プログラムの断片はタイプライタフォントで示す.
プログラム断片において任意の Haskell コード片を表す「穴」は if e1 then e2 else e3 のようにイタリック体で書く.概してイタリックの名前はニーモニックになっていて,e は式を,d は宣言を, declarations, t は型を表す.
Haskell は関数プログラミングの世界で人気になった多くの便利な構文構造を採用した.この報告書では,そういった糖衣構文の意味をより単純な構成に変換することで与える. これらの変換が完全に適用されれば、結果は Haskell カーネルと呼ぶ Haskell の小さなサブセットで書かれたプログラムになる.
このカーネルは形式的に仕様化されてはいないが,本質的には,直接的な表示的意味論をもつラムダ計算に少し糖衣構文をつけくわえたものである. それぞれの構文構造のカーネルへの変換は,その構文を導入した時に与える. このような部品化設計をすることによって,Haskell プログラミングに関する論証が行いやすくなり,この言語の実装者に使いやすい指針となる.
1つの式は評価されると1つの値となり,1つの静的な型を持つ.
Haskell においては型と値が混ざることはない.
しかしながら,型システムはさまざまな種類のユーザ定義のデータ型を許している.
また
id="dx6-12005"> (伝統的な Hindley-Milner の 型構造を使用した)パラメータ多相ばかりではなく,アドホック多相あるいは(型クラスを使用した)多重定義も許されている.
Haskell におけるエラーは意味論としては⊥ (「ボトム」))と同等である.
エラーは技術的にはプログラムが停止しないことと区別がつかないので,Haskell ではエラー検出あるいはエラー発生時の動作についての機構は言語には含まない.
もちろん,実装ではエラーに関して有用な情報を提供しようとすることになろう.
3.1節を参照のこと.
Haskell には6種類の名前がある.
変数名および構成子名 は値を表示(denote)し,型変数名,
型構成子名,型クラス名型システムに関わる実体を参照し,モジュール名はモジュールを参照する.
命名にあたっては以下の制約がある.
この 2 つだけが制約である.
たとえば,Int は一つの有効範囲のなかで同時にモジュール名,クラス名,構成子名になることができる.
1.4 名前空間