Учитывая следующее:
> (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 соответственно?