Действия ввода-вывода являются первоклассными значениями, как и любые другие; это то, что делает IO Haskell таким выразительным, что позволяет вам создавать структуры управления более высокого порядка (например, mapM_
) с нуля. Лень здесь не актуальна, 1 просто вы на самом деле не выполняете действие. Вы просто создаете значение Just (putStrLn "???")
, а затем выбрасываете его.
putStrLn "???"
существующий не приводит к выводу строки на экран. Само по себе putStrLn "???"
- это просто описание некоторого ввода-вывода, которое можно сделать, чтобы вызвать вывод строки на экран. Единственное, что происходит, это выполнение main
, которое вы создали из других действий ввода-вывода или любых действий, которые вы вводите в GHCi. Для получения дополнительной информации см. Введение в IO .
Действительно, вполне возможно, что вы захотите манипулировать действиями IO
внутри Maybe
; представьте себе функцию String -> Maybe (IO ())
, которая проверяет правильность строки и, если она действительна, возвращает действие ввода-вывода для вывода некоторой информации, полученной из строки. Это возможно именно благодаря первоклассным действиям ввода-вывода на Haskell.
Но монада не способна выполнять действия другой монады, если вы не дадите ей эту способность.
1 Действительно, h = putStrLn "???" `seq` return ()
также не приводит к выполнению ввода-вывода, даже если оно вызывает оценку putStrLn "???"
.