Учитывая следующее:
> (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"
Почему это происходит? Есть ли способ сделать IO monad ленивым?
В частности, данный value :: IO (Maybe a)
, какой (чистый, лаконичный) способ сказать
result <- (liftM2 fromMaybe) err value
и распечатать его или выбросить IOError соответственно?