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

型クラス: Enum

(工事中 70%)

列挙する

型クラスEnumは「列挙できる」という性質を表す。型クラスEnumのインスタンスにすると[x .. y]のような列挙が可能になる。ちなみに[x .. y ]はenumFromTo x yの構文糖だ。型クラスの定義は以下のようになっている。

class Enum a where
succ :: a -> a
pred :: a -> a
toEnum :: Int -> a
fromEnum :: a -> Int
enumFrom :: a -> [a]
enumFromThen :: a -> a -> [a]
enumFromTo :: a -> a -> [a]
enumFromToThen :: a -> a -> a -> [a]

succ = toEnum . (+ 1) . fromEnum
pred = toEnum . (subtract 1) . fromEnum
enumFrom x = map toEnum [fromEnum x ..]
enumFromThen x y = map toEnum [fromEnum x, fromEnum y ..]
enumFromTo x y = map toEnum [fromEnum x .. fromEnum y]
enumFromThenTo x1 x2 y = map toEnum [fromEnum x1, fromEnum x2 .. fromEnum y]

最低限必要な定義はtoEnumとfromEnumである。

それぞれのクラス関数

関数succ, pred

関数succは次の値をpredは前の値を返す。

関数toEnum, fromEnum

関数toEnumはInt型の値からその型への変換を、fromEnumはその型からInt型の値への変換を行う。この2つを定義しておけば他のクラス関数にはデフォルト定義を使える。

関数enumFrom, enumFromThen

[x ..]のような表現はenumFrom xに脱糖される。xからはじまって、xの次、xの次の次と続いていくリストを生成する。問題の型が無限に続く場合と範囲が決まっている場合とで動作は異なる。

[x, y ..]のような表現はenumFromThen x yに脱糖される。xからはじまってy - x刻みで次々に値を生成していく。これも値が無限に続く場合と範囲が決まっている場合とで動作が変わる。

関数enumFromTo, enumFromThenTo

[x .. y]のような表現はenumFromTo x yに脱糖される。xからyまでの1ずつ増加していくリストとなる。

[x, y .. z]のような表現はenumFromThenTo x y zに脱糖される。xから(y - x)刻みでzを越えない値までのリストとなる。

型クラスBoundedのインスタンスについて

enumFromやenumFromThenについてはデフォルトの定義が無限に続く型用のものだ。以下のように上書きする必要がある。

enumFrom x = enumFromTo x maxBound
enumFromThen x y = enumFromThenTo x y maxBound

ドリンクのサイズ

drinkSize.hs

型Sizeを型クラスEnumのインスタンスにする。

instance Enum Size where
toEnum 0 = Short
toEnum 1 = Tall
toEnum 2 = Grande
toEnum 3 = Venti
toEnum _ = error "bad argument"
fromEnum Short = 0
fromEnum Tall = 1
fromEnum Grande = 2
fromEnum Venti = 3
enumFrom x = enumFromTo x maxBound
enumFromThen x = enumFromThenTo x y maxBound

試してみる。

% ghci drinkSize.hs
*Main> [Short ..]
[Short, Tall, Grande, Venti]
*Main> [Short, Grande ..]
[Short, Grande]

「型クラス: Bounded」へもどる 「構文: deriving」へ

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