The Haskell 98 Report
top | back | next | contents | function index


1  イントロダクション

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

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

1.1  プログラムの構造

この節では、Haskell の抽象構文構造と抽象意味論構造について説明する。 またこのレポートの他の部分の組立てとの関係についても説明する。

  1. 最トップレベルでは Haskell プログラムとはモジュールの集 まりである。モジュールについては 5章で説明している。モジュールは名 前空間の制御と大規模プログラムにおけるソフトウェアの再利用の手段を提 供している。

  2. モジュールのトップレベルは、宣言の集まりである。宣言には いくつかの種類があるが、そのすべてについて 4 章で説明している。宣言は通常 の値、データ型、型クラス、結合性情報などを定義する。

  3. その下のレベルはである。これについては 3 章にて説明している。式はひとつ のを表示するものであり、静的な型を持つ。式は 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 は宣言を、t は型を表わす。

1.2  Haskell のカーネル

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

このカーネルは形式的に仕様化されてはいないが、本質的には、直接的な 表示的意味論をもつラムダ計算に少し糖衣構文をつけくわえたものである。 それぞれの構文構造のカーネルへの変換は、その構文を導入した時に与える。

1.3  値と型

一つの式は評価されると一つのとなり、一つの式は一つの静的 なを持つ。Haskell では値と型がまぜこぜになることはない。し かしながら、型システムではいくつもの種類の利用者定義のデータ型を許し ている。また、(伝統的な Hindley-Milner の型構造を使用した)パラメータ 多相性ばかりではなく、アドホック多相性あるいは(型クラスを使 用した)多重定義も許されている。

Haskell におけるエラーは意味論的には _|_ と同等である。技術的にはエ ラーは非停止と区別がつかないので、Haskell ではエラー検出あるいはエラー 発生時の動作についての機構は言語には含まない。もちろん、実装ではエラー に関して有用な情報を提供しようとすることになろう。

1.4  名前空間

Haskell には 6 種類の名前がある。変数名構成子名 は値を表し、型変数名型構成子名型クラス名 は型システムに関わる実体への参照であり、モジュール名はモジュー ルへの参照である。名前をつけるにあたっては、以下のような制約がある。

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

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


The Haskell 98 Report
top | back | next | contents | function index
December 2002