2015-03-01 6 views
3

Im a Haskell beginner, и я до сих пор изучаю теорию категории и ее практическое использование в информатике.Нотация и композиция Монады

Я провел последний день наблюдая за пару лекций из университета Беркли в о теории категорий, большая частью его содержания показывал математическое представление колец, полугруппы, группы, магмы, моноиды и т.д.

Таким образом, поднятые вопросы на мой взгляд, о монадическом составе и категории клейсли. Поэтому я хотел бы задать вопросы специалистам Haskell/Category Theory.

Является ли обозначение своего рода композицией монады?

С уважением,

Пабло Парада

+3

Вам не нужна теория категорий для использования большей части экосистемы Хаскелла. – Sibi

+0

Я бы сказал, что нотация 'do' - это счастливая случайность. Существует основная математическая теория для Монад - но Монада - это просто математическая конструкция '(m, return :: forall a.a -> m a, bind :: forall a b. m a -> (a -> m b) -> m b) '. Нотация - это синтаксический сахар, который совместим с структурой Монады; происходит, как «поток с контролем состояния» (что имеет смысл - монады часто используются для моделирования вычислений с учетом состояния), которые распознаются для программистов, поступающих с императивных языков; и облегчает (иногда) рассуждать о монадических вычислениях. – user2407038

ответ

4

Нотация - это просто синтаксический сахар для >>=. Код, такие как

do x <- a 
    b -- b is an expression possibly involving x 

является обессахаренным к

a >>= \x -> b 

Если вы изучаете монады в КТ, вы, вероятно, обнаружите, что они определяют как функторы с двумя естественных преобразованиями

unit :: a -> m a  -- also known as η 
join :: m (m a) -> m a -- also known as μ 

в то время как Haskell определяет

return :: a -> m a 
(>>=) :: m a -> (a -> m b) -> m b 

Обе презентации эквивалентны. Действительно, unit и return - это точно то же самое. Вместо этого join может быть выражено в терминах (>>=) следующим

join x = x >>= id 

и, наоборот, (>>=) может быть выражено в терминах join.

x >>= f = join (fmap f x) 

выше отметить, что fmap принимает a -> m b и m a вернуть m (m b), который затем уплощенный в m b по join.

8

ли сделать нотации своего рода монада композиции?

В описании нет ничего особенного. Это всего лишь синтаксический сахар над функциями монады. Хороший пример из Haskell wikibook:

do x1 <- action1 
    x2 <- action2 
    action3 x1 x2 

De-сахаров:

action1 
    >>= 
    \ x1 -> action2 
     >>= 
     \ x2 -> action3 x1 x2 

Реальный мир Haskell книга имеет хороший раздел, объясняющий, как это de-sugaring происходит в различных сценариях.

+0

Возможно, я не мог правильно выразить свой вопрос. В математической точке зрения обозначается ли композиция монады? Как вы уже сказали, десура выглядит как последовательность функций, а не состав. –

+0

@PabloParada do notation преобразуется компилятором в форму в ответе, поэтому эти два способа написания этого кода в точности эквивалентны друг другу. нотация - это еще один способ записи вызовов на '>> ='. Кроме того, обычно, когда я думаю о композиции монады в Haskell, я думаю о материалах на уровне типа, типа списка, состоящего из типа 'Maybe' (' [Maybe a] '). –

+0

@DavidYoung Получил то, что вы сказали, но то, что я пытаюсь получить, - это если обозначить абстрактную композицию для монадических структур. Когда я имею в виду композицию, она похожа на функциональную композицию. например: (g o f) (1) = g (f (1)). –