Ответ 1
Вы можете моделировать многие структуры. Здесь группа:
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, который содержит большой список примеров и приложений.