Каноническое объяснение этого состоит в том, что вы хотите сформировать новое монадическое значение из двух существующих. Давайте посмотрим на тип putStr,
IO ()
Это означает, что это некий черный ящик, который при выполнении «вернет» (единственное и единственное) значение типа единицы измерения. Ключевая идея монадических вычислений заключается в том, что у вас есть комбинатор >>=
, который будет объединять два монадических выражения, передавая результат одного в следующее (точнее, функцию, которая создает следующее). Одним из важных моментов является то, что библиотека IO
предоставляет этот комбинатор, а это означает, что
- Это [IO в данном случае] может пропустить второе монадическое значение, например, когда первое выдает исключение.
- Он может передавать другие данные, в случае
IO
состояния RealWorld
, содержащего дескрипторы открытых файлов и т. д.
- Он может «гарантировать», что первый оценивается первым, в отличие от большинства вычислений лямбда-выражений, где самые внешние («последние») термины расширяются первыми. Это важно для печати, где первая печать должна сначала изменить мир.
В вашем случае используйте это так,
putStr "0" >>= (\c -> putStr "0")
Есть короткий путь, конечно,
putStr "0" >> putStr "0"
и do-нотация, как упоминалось другим плакатом, которая является еще большим синтаксическим сахаром,
do
putStr "0"
putStr "0"
person
gatoatigrado
schedule
08.06.2011
case input of 0 -> … 1 -> …
- person Chuck   schedule 08.06.2011