新しく宣言した型を何らかの型クラスのインスタンスとして宣言するには,instance 宣言を使う。が,いくつかの型クラスに関してはもっと簡単な方法がある。data 宣言と一緒に deriving 修飾子を使うのがそれ。
次のようにすると,Cream 型を宣言すると同時に,Eq,Show,Read クラスのインスタンスとして宣言できる。
data Cream = Eric | Jack | Ginger deriving (Eq, Show, Read)
*Main> Eric == Eric True *Main> Eric /= Jack True *Main> show Ginger "Ginger"
deriving で指定できるのは,Eq,Ord,Enum,Bounded,Show,Read の6つだけ。この6つは頻繁に使われるからこういう簡便な方法が用意されているってことのようだ。とくに ghci で表示させるには Show クラスのインスタンスである必要があるので,黙って指定しておくべきだろう。
で,これらのクラスにどんなメソッドがあるのか,調べてみた。
- Eq クラス
- (==) :: a -> a -> Bool
- (/=) :: a -> a -> Bool
- Ord クラス
- compare :: a -> a -> Ordering
- (<) :: a -> a -> Bool
- (<=) :: a -> a -> Bool
- (>) :: a -> a -> Bool
- (>=) :: a -> a -> Bool
- max :: a -> a -> a
- min :: a -> a -> a
- Enum クラス
- succ :: a -> a
- pred :: a -> a
- toEnum :: Int -> a
- fromEnum :: a -> Int
- enumFrom :: a -> [a]
- enumFromThen :: a -> a -> [a]
- enumFromTo :: a -> a -> [a]
- enumFromThenTo :: a -> a -> a -> [a]
- Bounded クラス
- minBound :: a
- maxBound :: a
- Show クラス
- showsPrec :: Int -> a -> Shows
- show :: a -> String
- showList :: [a] -> Shows
- Read クラス
- readsPrec :: Int -> ReadS a
- readList :: ReadS [a]
いっぱいあるな,とくに Ord クラスと Enum クラスが。
ところで上のリストは Hoogle で調べたんだけど,Read クラスのメソッドに read がない。と思ったら別のところに書いてあった。これってつまり,read は Read クラスのメソッドじゃないってことか?