さて、型やクラスに関して、データの扱い方についておさらいしよう。
まず、取っかかりとして型が何か考えると、型宣言に現れる、IntやFloatがそれであるようだ。
実際の値は型を持っている。ここで、この値はインスタンスと呼ばれる。
*Test> :t 1::Int
1::Int :: Int
*Test> :t 1::Float
1::Float :: Float
まあ、無理矢理持たせたけど、こうやって型を持ってる。
この型はクラスで分類できる。
同じクラスであると、クラスメソッドが使える。
*Test> (1::Float) + (2::Float)
3.0
*Test> (1::Int) + (2::Int)
3
Numクラスのインスタンスである、どちらにも(+)が使えることがわかる。
そうそう、脱線するけど、型が異なるもの同士では計算できないよ。
*Test> (1::Int)+(2::Float)
<interactive>:1:10:
Couldn't match `Int' against `Float'
Expected type: Int
Inferred type: Float
In the expression: 2 :: Float
In the second argument of `(+)', namely `(2 :: Float)'
この場合は、型を変換しないと計算できないので注意。関数を作るときは気を付けなくちゃ。
*Test> (fromIntegral (1::Int))+(2::Float)
3.0
fromIntegralを覚えておこう。
ともかく、クラス⊃型という風に考えればいいかな。
関数では型が合ってないと計算できないけど、型が違っていても、同じような関数(メソッド)を使えるものがある。
その集合をクラスという。場合によっては、fromIntegralみたいな型変換をして計算が可能になる、と。
このように、型を分類するのにクラスは便利なんだ。そうすると、クラス自体も分類できると便利だ。
そこで
スーパークラスである。
これの特性自体は普通のクラスと変わりない。
ただ、スーパークラスは、下位のクラス(サブクラス)に共通するクラスメソッドを持っている。
*Test> :i Num
class (Eq a, Show a) => Num a
(略)
Showは前に見たから、Eqを見てみよう。
*Test> :i Eq
class Eq a where
(==) :: a -> a -> Bool
(/=) :: a -> a -> Bool
-- Imported from GHC.Base
instance Eq a => Eq [a] -- Imported from GHC.Base
instance Eq () -- Imported from GHC.Base
instance Eq Ordering -- Imported from GHC.Base
instance Eq Int -- Imported from GHC.Base
instance Eq Char -- Imported from GHC.Base
instance Eq Bool -- Imported from GHC.Base
instance Eq Float -- Imported from GHC.Float
instance Eq Double -- Imported from GHC.Float
instance Eq Integer -- Imported from GHC.Num
instance Eq a => Eq (Maybe a) -- Imported from Data.Maybe
instance (Eq a, Eq b) => Eq (Either a b)
-- Imported from Data.Either
何だか分かる気がするね。どうかな?
(==)は同値か調べる関数だね。
(/=)は、他の言語とは違うけど、異値か調べる関数だね。何で!=ではないんだろう。
*Test> x /= 1
False
まあ、予想通りだね。関数を読むときは、現れる型が何になっているか注意してね。
まだ知らない型が出てきたけど、これは次の機会に。
それと、(Eq a, Eq b)という形があるね。これは
タプルっていうんだ。これも別に項を作った方がいいね。
さて、EqはNumのスーパークラスだから、NumもEqのクラスメソッドが使える。
というのは上で試した通りだね。まあ、EqのインスタンスにもちゃんとIntやFloatが載っている。
Eq⊃Num & Num⊃Int → Eq⊃Intという包含関係だね。
このような関係が扱えると、分類の意味も分かりやすくなるし、
新しいクラスを作るときも、スーパークラスを用いて簡潔に表せる。
実際にクラスを作るには、もうちょっと知識が必要かな?
色々な型について知らないといけないし、
多重定義についても知っておいた方がいいと思う。
それと、
タプルも説明しておかないとね。
分岐が多いなあ(汗
最終更新:2007年09月27日 04:47