Подтвердить что ты не робот

Существуют ли какие-либо алгебраические структуры, используемые в функциональном программировании, другие, тогда моноидные?

Недавно я познакомился с функциональным программированием (в Haskell и Scala). Его возможности и элегантность довольно очаровательны.

Но когда я встретил Монады, которая использует алгебраическую структуру по имени Моноид, я был удивлен и рад видеть, что теоретические знания, которые я изучал из математики, используются в программировании.

Это наблюдение вызвало у меня вопрос: могут ли группы, поля или кольца (см. Algebraic Structures для других) использовать в программировании для более абстракции и повторного использования кода и достижения математического программирования?

Как я знаю, язык с именем Fortress (который я бы наверняка предпочел на любом языке один раз, когда его компилятор завершен) определяет эти структуры в его библиотечном коде. Но использовать только то, что я видел до сих пор, было для числовых типов, с которыми мы уже знакомы. Могут ли быть другие виды использования?

С уважением, ciun

4b9b3361

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

Ответ 2

Haskell Arrows - это обобщение монадов и, вероятно, актуально.

Ответ 3

Я бы рекомендовал Edward Kmett очень читаемый блог и связанные с ним категории. Должно быть, вы будете заняты годами.