Mercury 勉強メモ

関数論理型言語 Mercury を勉強するブログです.

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