Chapter 1
イントロダクション

Haskell は汎用の純粋関数型プログラミング言語で,プログラミング言語設計の分野における最近の革新が多く取入れられている. Haskell が提供するのは,高階関数,非正格の意味論,静的多相型付け,ユーザ定義の代数デー タ型,パターン照合,リスト内包表記,モジュールシステム,モナド I/O システムである. また,さらに次のような豊かなプリミティブデータ型が用意されている. リスト,配列,任意倍長整数,固定倍長整数,浮動小数点数.Haskell は非正格関数型言語に関する長年の研究を凝縮したものであり,また,その頂点に立つものである.

この報告書は Haskell で書かれたプログラムの構文とそのプログラムの意味に対する非形式的抽象意味論を定義するものである.Haskell のプログラムがどのように処理され、解釈され、コンパイルされるかなどといった部分に依存する実装の問題には触れない. ここではとりあげない問題にはプロ グラミング環境の性質や未定義(すなわち,形式的には と評価される)プログラムに関するエラーメッセージも含まれる.

1.1 プログラム構造

この節では Haskell の抽象構文としてと抽象意味論としての構造について説明する. また,そのような構造が報告書の残りの部分の組み立てと,どのように関係しているかについても説明する.

  1. 最上位レベルでは Haskell プログラムとはモジュールの集まりである.モジュールについては 5章で説明する.モジュールは名前空間の制御と大規模プログラムにおけるソフトウェアの再利用の手段を提供している.
  2. モジュールの最上位レベルは宣言の集まりである.宣言にはいくつかの種類があるが,そのすべてについて 4章で説明する.宣言は通常の値,データ型,型クラス,結合性情報などを定義する.
  3. その下のレベルはである.これについては 3章で説明する.式はひとつのを表示(denote)するものであり, 静的型をもつ.式はHaskellプログラミングの核心であり,「小さい Haskell プログラムそのもの」である.
  4. 最下位レベルにあるのは Haskell の字句構造である.これについては 2章で定義する.字句構造はテキストファイルにおける Haskell プログラムの具体的表現を捉えたものである.

この報告書では Haskell の構文構造をボトムアップに説明していく.

上では言及しなかったが,6章では Haskell に標準で組み込まれている型と型クラスについて,7章で は,Haskellでの I/O 機能(すなわち,Haskell のプログラムはどのようにして外界と交信するか)について議論する. いくつかの章では,プレリュード,具象構文,文芸的プログラミング,導出インスタンスの仕様,それにほとんどの Haskell コンパイラでサポートされているプラグマについても説明する.

この報告書では,Haskell プログラムの断片はタイプライタフォントで示す.

 let x = 1  
     z = x+y  
 in  z+1

プログラム断片において任意の Haskell コード片を表す「穴」は if e1 then e2 else e3 のようにイタリック体で書く.概してイタリックの名前はニーモニックになっていて,e は式を,d は宣言を, declarations, t は型を表す.

1.2 Haskell カーネル

Haskell は関数プログラミングの世界で人気になった多くの便利な構文構造を採用した.この報告書では,そういった糖衣構文の意味をより単純な構成に変換することで与える. これらの変換が完全に適用されれば、結果は Haskell カーネルと呼ぶ Haskell の小さなサブセットで書かれたプログラムになる.

このカーネルは形式的に仕様化されてはいないが,本質的には,直接的な表示的意味論をもつラムダ計算に少し糖衣構文をつけくわえたものである. それぞれの構文構造のカーネルへの変換は,その構文を導入した時に与える. このような部品化設計をすることによって,Haskell プログラミングに関する論証が行いやすくなり,この言語の実装者に使いやすい指針となる.

1.3 値および型

1つの式は評価されると1つのとなり,1つの静的なを持つ. Haskell においては型と値が混ざることはない. しかしながら,型システムはさまざまな種類のユーザ定義のデータ型を許している. また id="dx6-12005"> (伝統的な Hindley-Milner の 型構造を使用した)パラメータ多相ばかりではなく,アドホック多相あるいは(クラスを使用した)多重定義も許されている.

Haskell におけるエラーは意味論としては(「ボトム」))と同等である. エラーは技術的にはプログラムが停止しないことと区別がつかないので,Haskell ではエラー検出あるいはエラー発生時の動作についての機構は言語には含まない. もちろん,実装ではエラーに関して有用な情報を提供しようとすることになろう.  3.1節を参照のこと.

1.4 名前空間

Haskell には6種類の名前がある. 変数名および構成子名 は値を表示(denote)し,型変数名型構成子名型クラス名型システムに関わる実体を参照し,モジュール名はモジュールを参照する. 命名にあたっては以下の制約がある.

  1. 変数名と型変数名は小文字あるいはアンダースコアではじまる識別子である. それ以外の4種類の名前は大文字ではじまる識別子である.
  2. ひとつの識別子を同じ有効範囲で型構成子名およびクラス名として同時に使用してはならない.

この 2 つだけが制約である. たとえば,Int は一つの有効範囲のなかで同時にモジュール名,クラス名,構成子名になることができる.