Я недавно узнающий о функциональном программировании (в Haskell и Scala). Это - возможности, и элегантность довольно очаровательна.
Но то, когда я встретил Монады, который использует алгебраическую структуру под названием Моноид, я был удивлен и доволен видеть теоретическое знание, которое я узнавал из Математики, используется в программировании.
Это наблюдение принесло вопрос в мой ум: Can Groups, Поля или Кольца (см. Алгебраические структуры для других) использоваться в программировании для большего количества абстракции и целей повторного использования кода и достижения, математически-подобного программирование?
Как я знаю, язык под названием Крепость (который я, конечно, предпочел бы по любому языку однажды, когда его компилятор завершается), определяет их структура в его коде библиотеки. Но только использование, которое я видел до сих пор, уже было для числовых типов, который мы знакомо с. Могло быть какое-либо другое использование их?
С наилучшими пожеланиями, ciun
Вы можете моделировать множество структур. Вот группа:
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 , в которой есть большой список примеров и приложений.
Стрелки в Haskell являются обобщением монад и, вероятно, актуальны.