Mercury 入門 (4) タプル,代数的データ型
タプル
複数の値をまとめてひとつの値として扱いたい場合は,タプル(組)が利用できます.
例えば,string
型の"x"
と,int
型の12
のタプルは,
{"x", 12}
のように表し,その型は,
{string, int}
のように書き表します. タプルの例は後の入門記事で出てきます.
代数的データ型
代数的データ型を使うと,ユーザが新しい型を定義できます. Mercury の代数的データ型は Haskell のそれと構文を除いて全く同じです. Haskell を知らない人は,C言語の構造体と列挙体と共用体を組み合わせたもの というとイメージしやすいと思います.
ここでは,3つの例で代数的データ型の作り方を示します.
例1 自動車用信号の状態
青(green
)・黄(yellow
)・赤(red
)の3つの値からなる型signal
は,以下のように定義できます.
:- type signal
---> green
; yellow
; red.
例として信号の切り替えをするプログラムを示します.
実行結果
green
yellow
red
名簿
人物の名前と年齢を保持するデータ構造を作ります.
:- type person
---> person(name::string, age::int).
上の定義でperson
型が定義されます.値は,
person("サザエ", 24)
のようにして作ります.
論理型言語の日本語チュートリアルでは, サザエさんを具体例として出すのが定番なので, ここではサザエ,カツオ,ワカメの3人の名前と年齢を表示するプログラムを示します.
実行結果
{name = サザエ, age = 24}
{name = カツオ, age = 11}
{name = ワカメ, age = 9}
24
多相の二分木
最後の例は,定番のデータ構造である二分木です. ここでは,型パラメータを使って多相の(つまり任意の型で使える)二分木を定義します.
:- type tree(T)
---> leaf(T)
; branch(tree(T), tree(T)).
このデータ構造を使ったプログラム例を以下に示します.
実行結果
10
20
30
a
b
c
d