型クラスとインスタンス
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/11/20 02:06 UTC 版)
「Haskell」の記事における「型クラスとインスタンス」の解説
型クラスは相異なるデータ型に共通したインターフェイスを持つ関数を定義する。例えば、順序づけることができる要素をもつリストをソートできる関数 sort を定義することを考える。リストの要素のデータ型は関数 sort を定義するときには不明であり、その要素をどのように順序付けるかを予め決定しておくことはできない。数値型も文字列型もそれぞれのデータを順序付けることができるであろうが、共通してデータの順序を返す抽象的な関数 order を定義することができれば、それを用いてソートすることができる。 まず型クラス Comparer を定義して、順序付ける関数 order の形式を定義する。値の順序を調べる関数 order x y は x → y が昇順のときは負の値、降順の時は正の値、x と y が等しいときは 0 を返すものとする。ここで class は型クラスの宣言であることを示す予約語である。 class Comparer a where order :: a -> a -> Int 型クラスを実装するには、対象のデータ型に対してインスタンス宣言を行う。次は型 a の型クラス Comparer に対するインスタンスを宣言したものである。このインスタンス宣言により、Enum のインスタンスである任意の型のリストを辞書順に比較できる。例えば、文字列 Char は Enum のインスタンスの Char のリストであり、このインスタンス定義により order を適用することができるようになる。ここで関数 fromEnum c は文字 c を数値に変換する関数である。Comparer のインスタンスを定義する型 a を Eq および Enum のインスタンスを持つものに限定しているので((Eq a, Enum a) => の部分)、インスタンス定義の内部で Eq の関数である (/=) や Enum の関数である fromEnum を使うことができている。 instance (Eq a, Enum a) => Comparer [a] where order [] [] = 0 order _ [] = 1 order [] _ = -1 order (x:xs) (y:ys) | x /= y = fromEnum x - fromEnum y | otherwise = order xs ys 次にリストをクイックソートする関数 sort を示す。型クラスを用いて順序付ける関数 order を抽象化したため、このように型クラス Comparer のインスタンスを持つ全ての型の値に適用できる一般化されたソート関数を定義できるのである。 sort :: Comparer a => [a] -> [a] sort [] = [] sort (x:xs) = sort [e | e <- xs, order e x < 0] ++ [x] ++ sort [e | e <- xs, order e x >= 0] この関数 sort は次のように使う。 main = do print (sort ["foo", "bar", "baz"]) -- ["bar", "baz", "foo"] と出力される。 print (sort [[5, 9], [1, 2], [5, 6]]) -- [[1, 2], [5, 6], [5, 9]] と出力される。 Haskell のインスタンス宣言は複数の型に共通する操作を定義するという点で Java や C# の「インターフェイス」と似ているが、Haskell では既存の任意の型についてもインスタンスを定義できる点でもインターフェイスに比べて柔軟である。
※この「型クラスとインスタンス」の解説は、「Haskell」の解説の一部です。
「型クラスとインスタンス」を含む「Haskell」の記事については、「Haskell」の概要を参照ください。
- 型クラスとインスタンスのページへのリンク