2016-06-05 4 views
0

Я пытаюсь понять правила создания монады. Насколько я понимаю, это зависит от типа данных, которые я хочу использовать и что монада должна выполнить три закона:Haskell - создание монады

1. m >>= return = m 
2. return x >>= f = f x 
3. (m >>= f) >>= g = m >>= (\x-> f x) >>= g 

Okay. Итак, для монады Maybe У меня есть последние 2 строки. Для чего «x» стоит в третьей строке. Если должна быть функция, не так ли?

data Maybe a = Nothing | Just a 
instance Monad Maybe where 
    (Just x) >>= f = f x 
    Nothing >>= _ = Nothing 
    _ >>= x = x 

fail _ = Nothing 

(я не могу сейчас найти источник этого определения, но я нашел его где-то)

я нашел другую версию, а также - зачем мне нужна строка с «провал»?

data Maybe a = Nothing | Just a 
instance Monad Maube where 
    return x = Just x 

    Just x >>= f = f x 
    Nothing >>= f = Nothing 

    fail _ = Nothing 

(источник: http://learnyouahaskell.com/a-fistful-of-monads)

+0

Можете ли вы предоставить источник, из которого вы получили эти определения? –

+2

'_ >> = x = x' просто неправильно. '>> =' имеет тип 'ma -> (a -> mb) -> mb', поэтому это определение игнорирует значение« ma »(которое мы знаем как« Just », но это не имеет значения здесь) и пытается вернуть значение «a -> mb», как если бы оно было «mb». – chepner

+1

Действительно. _Where точно_ вы нашли это определение с '_ >> = x = x'? По крайней мере, это ни в онлайн-версии LYAH, ни в моей печатной версии. И, ну, это не должно быть, неправильно. – leftaroundabout

ответ

3

Я предлагаю вам прочитать this chapter of 'Learn you a Haskell', он предоставляет некоторые примеры, которые должны помочь вам прояснить, что такое монада.

Возвращаясь к вопросу о x, это не функция, но это значение содержится в Just. Maybe a - это тип с двумя разными конструкторами: Nothing, что означает, что он не имеет значения, и Just a, что означает, что он держит значение типа a.

Давайте посмотрим на подпись >>=. Это (>>=) :: m a -> (a -> m b) -> m b, а это значит, что требуется монада m a, функция (a -> m b) и возвращает монаду m b. Обратите внимание, что у вас есть одна и та же монада m, но, возможно, другое значение параметра своего типа (от a до b).

Для Maybe a нам необходимо обрабатывать два случая: когда у нас есть значение (Just a) или когда у нас нет значения (Nothing). >>= для Maybe реализован таким образом, что применяется f к значению, имеющему значение, в противном случае оно просто распространяется Nothing. В вашем примере у вас также есть _ >>= x = x, но это не нужно, так как вы уже исчерпывающе соответствовали всем возможным шаблонам.

Смежные вопросы