型の定義

このページは最後に更新されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

last mod. 2012-08-10 (金) 01:39:43

関数型言語の比較

OCaml

type宣言によって宣言できます。

type t = int;;
type x = X of int;;
type 'a option = None | Some of 'a;;
type 'a pt = Point of 'a * 'a;;

多相バリアントは全体を [] で囲む必要があります。

type 'a pt = [ `point of 'a * 'a ];;

コンストラクタは構文であって、関数ではありません。

# X;;
The constructor X expects 1 argument(s), but is here applied to 0 argument(s)

コンストラクタは大文字で始まり、多相バリアントのコンストラクタはバッククォートで始まる必要があります。型変数名はシングルクォートで始まる必要があります。

そのままでは、

type t = t -> t

の様な再帰的な型は定義できません。t の中で t を使う場合は、

type t = T of t

のようにバリアントを挟むか、--rectypes オプションを付けて起動する必要があります。

SML

型の別名はtype宣言を、バリアントはdatatype宣言を使う必要があります。

type t = int;
datatype x = X of int;
datatype 'a option = None | Some of 'a;
datatype 'a pt = Point of 'a * 'a;

コンストラクタは関数です。

- X;
val it = fn : int -> x

コンストラクタの名前に制限はありません。 また、型名とコンストラクタ名の名前空間は分離しています。

datatype x = x of int;

型変数名はシングルクォートで始まる必要があります。

Haskell

型の別名はtype 宣言を、バリアントの定義はdata宣言を使います。

type T = Integer
data x = X int
data Maybe a = Nothing | Just a
data Pt a = Point a a

(データ)コンストラクタは関数です。

Main> :t X
X :: Integer -> X

部分適用も可能です。

Main> :t Point
Point :: a -> a -> Pt a
Main> :t Point 1
Point 1 :: Num a => a -> Pt a

型名と(データ)コンストラクタはともに大文字で始まる必要があります。 型名と構築子名の名前空間は分離しています。 型変数名は小文字で始まる必要があります。

新規 編集 添付