多くの構造をモデル化できます。ここにグループがあります:
class Group a where
mult :: a -> a -> a
identity :: a
inverse :: a -> a
instance Group Integer where
mult = (+)
identity = 0
inverse = negate
-- S_3 (group of all bijections of a 3-element set)
data S3 = ABC | ACB | BAC | BCA | CAB | CBA
instance Group S3 where
mult ABC x = x
... -- some boring code
identity = ABC
inverse ABC = ABC
... -- remaining cases
-- Operations on groups. Dual:
data Dual a = Dual { getDual :: a }
instance Group a => Group (Dual a) where
mult (Dual x) (Dual y) = Dual (mult y x)
identity = Dual identity
inverse (Dual x) = Dual (inverse x)
-- Product:
instance (Group a, Group b) => Group (a,b) where
mult (x,y) (z,t) = (x `mult` z, y `mult` t)
identity = (identity, identity)
inverse (x,y) = (inverse x, inverse y)
これで、結果を書き込んmult (Dual CAB, 5) (Dual CBA, 1)
で取得できます。これは、グループ S 3 * ⨯ Z での計算になります。他のグループを追加し、可能な方法でそれらを組み合わせて、それらを使用して計算を行うことができます。
リング、フィールド、順序付け、ベクトル空間、カテゴリなどでも同様のことができます。Haskell の数値階層は残念ながらうまくモデル化されていませんが、それ を修正しようとする数値プレリュードがあります。また、極端なDoConもあります。型クラスのツアー (主に圏論に動機付けられています) について は、例とアプリケーションの多数のリストがあるTypeclassopediaがあります。