Я новичок в монады и ее использования и следующую структуру, используя сделай заявление было мне совершенно запутался: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.
Причина этого заключается в том, что обозначение do - это просто * синтаксический сахар * для '>> =', и поскольку у вас есть два разных разных '>> =' здесь, вы получаете это различное поведение и разные описания того, что происходит на. Я думаю, что я помню ваш вопрос, и я думаю, что даже сделал 'do' в качестве альтернативной версии для вашего вопроса с' >> = ' – Carsten
. Здесь уже задан вопрос/ансер: https://stackoverflow.com/questions/8019670/desugaring-do-notation-for-monads – Carsten
также можете посмотреть на это: http://www.learnyouahaskell.com/a-fistful-of-monads - Я не думаю, что мы могли бы объяснить это лучше (или с более приятные фотографии);) – Carsten