2014-10-12 5 views
1

Я новичок в монады и ее использования и следующую структуру, используя сделай заявление было мне совершенно запутался:Haskell монады и утверждение делать

pairs xs ys = do x <- xs 
       y <- ys 
       return (x, y) 

Мне сказали, что это должно вернуть все возможные пары х и у, которые я не понимаю, потому что я раньше учил, что следующий код:

eval (Val n) = Just n 
eval (Div x y) = do n <- eval x 
        m <- eval y 
        safediv n m 

означает: выполнить eval x, а затем сохранить его результат, если не равно Nothing (в противном случае не возвращать ничего), как n, то же для eval y, а затем, если оба они не Nothing, он перейдет к окончательной функции safediv, которая объединяет оба результата (и в противном случае возвращает Nothing).

Однако 1-е использование do-statement в функции pairs работает совсем по-другому?

Если кто-то может помочь мне в этом и объяснить, что на самом деле является надлежащей функциональностью do-statement и его структурой, это было бы высоко оценено!

С уважением, Skyfe.

+1

Причина этого заключается в том, что обозначение do - это просто * синтаксический сахар * для '>> =', и поскольку у вас есть два разных разных '>> =' здесь, вы получаете это различное поведение и разные описания того, что происходит на. Я думаю, что я помню ваш вопрос, и я думаю, что даже сделал 'do' в качестве альтернативной версии для вашего вопроса с' >> = ' – Carsten

+0

. Здесь уже задан вопрос/ансер: https://stackoverflow.com/questions/8019670/desugaring-do-notation-for-monads – Carsten

+0

также можете посмотреть на это: http://www.learnyouahaskell.com/a-fistful-of-monads - Я не думаю, что мы могли бы объяснить это лучше (или с более приятные фотографии);) – Carsten

ответ

4

Строительство do в любое монада, и там вы используете его в двух разных монадах.

В первом случае

pairs xs ys = do x <- xs 
       y <- ys 
       return (x, y) 

вы работаете в списке монады, т.е. []. Вы можете видеть это, потому что используете x <- xs и xs имеет тип [something].

Во втором случае

eval (Val n) = Just n 
eval (Div x y) = do n <- eval x 
        m <- eval y 
        safediv n m 

вы работаете в Maybe монады. Действительно, вы используете y <- eval x и eval возвращает Maybe something.

Каждая монада определяет свои собственные правила о том, что должно означать <-. В списке монада это примерно означает «рассмотреть все возможные элементы», в «Возможно, один» возьмите x в Just x и проиграйте иначе ».

Технически <- конструкция в пределах do является обессахаренной в вызов оператор >>=, что каждая монада определяет независимо друг от друга.

+0

Спасибо! Я не знал о различных функциях <- для разных типов монад, я получил его сейчас. – user2999349