do-конструкция является синтаксическим сахаром (другим синтаксическим представлением чего-либо с целью удобства в использовании) для операции связывания (>>=):do
x <- m
e x Одно и тоже, что и m >>= \x -> e x Где m - это выражение, возвращающее объект внутри монадического контейнера, a x - свободная переменная, которой, в императивной семантике, присваиваится объект из монадического контейнера возвращаемого m.Примеры работы с монадой []do x <- [3,4,-2]; return x --> [3,4,-2]
do x <- [3,4,-2]; [x] --> [3,4,-2] -- return :: a -> [a]
do x <- [3,4,-2]; [x + 3] --> [6,7,1]
do x <- [3,4,-2]; return (x + 3) --> [6,7,1]
do x <- [3,4,-2]; (\v -> [-2, -3, v + 3]) x --> [-2,-3,6,-2,-3,7,-2,-3,1]
do x <- [3,4,-2]; [x + 3, x - 2] --> [6,1,7,2,1,-4]
do x <- [3,4,-2]; if x == 3 then [0] else [x + 1, x + 2] --> [0,5,6,-1,0] -- даёт concat [[0], [5, 6, -1], [0]]
do x <- [1, 2]; y <- [x + 4]; return y --> [5,6]
do x <- [1, 2]; y <- [x + 4, 0, 0]; return y --> [5,0,0,6,0,0]
do x <- [1, 2]; y <- [x + 4, 0, 0]; return [y] --> [[5],[0],[0],[6],[0],[0]] -- может быть другого типа Примеры работы с монадой Maybedo x <- Just 8; return x --> Just 8
do x <- Just 3; Just x --> Just 3
do x <- Just 3; Nothing --> Nothing
do x <- Just 3; Just (Just x) --> Just (Just 3)
do x <- Just 3; return (Just x) --> Just (Just 3)
do x <- Just 3; Just (Just (x + 1)) --> Just (Just 4) |