Haskell-型クラス
型クラスについて
型クラスとは
型クラスとは、型の振る舞いを定義するものです。
オブジェクト指向におけるクラスとは概念が異なり、Interfaceや抽象クラスに相当します。
class 型クラス 型 where
条件式
インスタンスとは
インスタンスとは、型クラスの制約を満たすように定義した型のことです。
オブジェクト指向におけるインスタンス(クラスの実体)とは概念が異なり、クラスの実装(Implement)に相当します
instance 型クラス 型 where
条件式
型クラスのサンプル
入力データに対する型を表示します。
#!/usr/bin/env runghc
-- なにかを受け取って文字列を返す
class Myclass a where
cfunc :: a -> String
-- 受け取りデータに対する実装
instance Myclass Char where
cfunc _ = "Char"
instance Myclass Int where
cfunc _ = "Int"
instance Myclass Bool where
cfunc _ = "Bool"
func :: (Myclass a) => a -> String
func x = cfunc x
main = do print $ func (100::Int)
print $ func 'a'
print $ func True
基本的な型クラス
よく使用する型クラスとインスタンスの例を記載します。
Eqクラス
Eqのインスタンスは、等価性検査の型に使われ、「==」や「/=」で比較できる型を表します。
Int、Bool、Charといった基本的なデータは全てEqのインスタンスとなります。
Prelude> :t (==)
(==) :: (Eq a) => a -> a -> Bool
Ordクラス
Ordのインスタンスは、順序を持った型に使われ、大小の比較ができることを保証する。
(<)、(<=)、(>)、(>=)の四つの比較関数は全て同一の型を持ちます。
Prelude> :t (>)
(>) :: (Ord a) => a -> a -> Bool
Showクラス
Showのインスタンスは、文字列表現を返します。
文字列表現を返すshow関数やprint関数は、Showのインスタンスです。
Prelude> :t show
show :: (Show a) => a -> String
derivingキーワード
derivingキーワードを使えば,Haskellが型クラスの文脈での振る舞いを自動導出します。
自動導出できるクラスは以下の通りです。
- Eq
- Ord
- Enum
- Bounded
- Show
- Read
data Maybe a = Nothing | Just a deriving (Eq, Ord, Read, Show)
data Either a b = Left a | Right b deriving (Eq, Ord, Read, Show)
data Ordering = LT | EQ | GT deriving
(Eq, Ord, Bounded, Enum, Read, Show)