В главе Real World Haskell они дают обоснование (>>)
следующим образом:
Мы используем эту функцию, когда хотим выполнить действия в определенном порядке, но не заботимся о результате.
Затем они приводят хороший пример, демонстрирующий это:
ghci > print "foo" >> print "bar"
"foo"
"bar"
Позже в этой главе они используют ту же концепцию для генерации случайных значений в монаде State:
getRandom :: Random a => RandomState a
getRandom =
get >>= \gen ->
let (val, gen') = random gen in
put gen' >>
return val
Но почему в этом случае они используют оператор put gen' >>
, когда в конечном итоге игнорируют его выходное значение. Почему вышеуказанная функция не может быть примерно такой:
getRandom :: Random a => RandomState a
getRandom =
get >>= \gen ->
let (val, gen') = random gen in
return val
Просто для завершения этого вопроса я добавляю связанные определения типов и функции для вышеуказанного контекста:
newtype State s a = State {
runState :: s -> (a, s)
}
get :: State s s
get = State $ \s -> (s, s)
put :: s -> State s ()
put s = State $ \_ -> ((), s)
type RandomState a = State StdGen a
put
? - person d8d0d65b3f7cf42   schedule 30.11.2013getRandom
и вам не нужно заботиться о том, как он передается генератору. — Но, конечно, есть приложения, в которых вам действительно нужны явные побочные эффекты без полезного возвращаемого значения. Однако обычно вы будете использовать нотациюdo
, поэтому>>
действительно не очень часто встречается. - person leftaroundabout   schedule 01.12.2013