top page > computer > haskell > web_lecture > for_programmer > adt_enum.html
更新日:
文責: 重城良国

列挙型: トランプのスートと色

suit.hs

はじめに

トランプには

の4種類のスートがある。一般的にスペードとクラブは黒でハートとダイヤは赤だ。スートを指定すると色を三原色(赤、緑、青)の3つの整数で返す関数を作る。

Wikipedia: スートと色

扱う値の型

三原色の組

3つの整数の組とする。値は大きくならないのでInt型とする。型シノニムを定義する。

type RGB = (Int, Int, Int)

スート

文字列や整数値で表現

スートをどう表現するか。文字列で"spade"、"heart"、"diamond"、"club"のようにするか、スペードを0、ハートを1、ダイヤを2、クラブを3のようにするか。

美しくない!

スートは4種類の値のみだ。文字列や整数値にはスートとして「正しくない」値もある。文字列ならば"kidney"とか"sapphire"とかだ。整数値ならば289や98765などだ。

型とその型の値を作る

なければ作る。真偽値に対しては型Boolがありその型の値はFalse、Trueの2つだ。同じように4種類のスートを表現する型Suitを作る。

data Suit = Spade | Heart | Diamond | Club

4種類の値Spade、Heart、Diamond、Clubを持つ型Suitを定義した。

% ghci suit.hs
*Main> :t Spade
Spade :: Suit
*Main> Spade

<interactive>:X:Y:
No instance for (Show Suit) arising from a use of `print'
Possible fix: add an instance declaration for (Show Suit)
In a stmt of an interactive GHCi command: print it

「型Suitは型クラスShowのインスタンスじゃないよ」と怒られた。対話環境で自作の型を簡単に表示する方法はあとで学ぶ。型を作っただけでは対話環境では表示できないことだけを覚えておく。

型Colorを定義する。黒と赤の二色だ。

data Color = Black | Red

*Main> :reload
*Main> :t Black
Black :: Color

関数の型

スートからRGBの3整数の組を求める。

rgb :: Suit -> RGB

関数rgbを定義する部品として2つの関数を定義する。スートから色を求める関数と色からRGB値を求める関数だ。

color :: Suit -> Color

toRGB :: Color -> RGB

関数の実装

関数colorとtoRGBを合成して関数rgbを作る。

rgb = toRGB . color

関数colorはスートと色を関連づける。

color Spade = Black
color Heart = Red
color Diamond = Red
color Club = Black

関数toRGBは色を3整数のタプルにする。

toRGB Black = (0, 0, 0)
toRGB Red = (0xff, 0, 0)

16進数の値は0x...のように書く。

試してみる

% ghci suit.hs
*Main> rgb Heart
(255,0,0)
*Main> rgb Club
(0,0,0)

構文

予約語dataに型名、等号、値の名前を|で区切ったものを続ける。型名や値の名前は大文字ではじまる識別子だ。型名と値の名前とでは名前空間が異なるので同じ名前を使っても良い。

data [型] = [値1] | [値2] | ...

まとめ

値の列挙で新しい型を作る方法を学んだ。作成した型の値はリテラルとしてコード内に直接書ける。パターンとしてパターンマッチにも使える。

課題

  1. 性別を表現する型を定義せよ
  2. 型Boolはどのように定義されるか考えてみよう
  3. 日曜日から土曜日までを表現する型を作れ

「パーサ: 計算機」へもどる 「deriving Show」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics