Извлечение значения Maybe в IO

Учитывая следующее:

> (liftM2 fromMaybe) (ioError $ userError "OOPS") (return $ Just "ok")

ghci дает мне

*** Exception: user error (OOPS)

] Конечно, fromMaybe работает правильно:

> (liftM2 fromMaybe) (return $ "not me") (return $ Just "ok")
"ok"

Но кажется, что операция ввода-вывода выполняется, а затем отбрасывается:

> (liftM2 fromMaybe) (putStrLn "computing.." >> "discarded") (return $ Just "ok")
computing..
"ok"

Почему это происходит? Есть ли способ сделать монаду ввода-вывода более ленивой?

В частности, , учитывая value :: IO (Возможно a) что это (чистый, краткий) способ сказать

result <- (liftM2 fromMaybe) err value

и получить результат распаковки или выбросить ошибку IOError соответственно?

15
задан Nathan Kleyn 13 April 2013 в 19:05
поделиться