Exceptions and IO

Ashley Yakeley ashley@semantic.org
Thu, 16 May 2002 03:22:55 -0700


--Emailer_-1188410616
Content-Type: text/plain; charset="US-ASCII"

My confusion surrounding exceptions in the IO monad comes from the fact 
that IO failures and "bottom" are not cleanly separated. I had always 
assumed the IO monad looked something like this:

     newtype IO a = IO (RealWorldState -> Either IOFailure 
(RealWorldState,a))

     return a = IO (\r -> Right (r,a))
     fail s = IO (\r -> Left (userFailure s))

This would make sense, I think, because it's so easy this way for 
Prelude.catch to catch all IOFailures but leave pure "bottom" exceptions 
alone, just as the report says. But in fact IO looks more like this:

     newtype IO a = IO (RealWorldState -> (RealWorldState,a))

     return a = IO (\r -> (r,a))
     fail s = IO (\r -> throw (userError s))

...which means Prelude.catch has to separate out exceptions caused by 
"fail" from those caused by error, etc. and there's confusion between 
"bottom" and exceptions that happen entirely in IO.

-- 
Ashley Yakeley, Seattle WA

--Emailer_-1188410616
Content-Type: text/plain; name="TestException.hs";
 x-mac-type="54455854";
 x-mac-creator="522A6368"
Content-transfer-encoding: base64
Content-Disposition: Attachment; filename="TestException.hs"

LS0gZ2hjIC1wYWNrYWdlIGxhbmcgVGVzdEV4Y2VwdGlvbi5ocyAtbyBUZXN0RXhjZXB0aW9uICYm
IC4vVGVzdEV4Y2VwdGlvbgptb2R1bGUgTWFpbiB3aGVyZQoJewoJaW1wb3J0IElPUmVmOwoJaW1w
b3J0IHF1YWxpZmllZCBFeGNlcHRpb247CgoJZ2V0UHVyZUV4Y2VwdGlvbiA6OiBhIC0+IElPIChN
YXliZSBFeGNlcHRpb24uRXhjZXB0aW9uKTsKCWdldFB1cmVFeGNlcHRpb24gYSA9IChFeGNlcHRp
b24uY2F0Y2ggKHNlcSBhIChyZXR1cm4gTm90aGluZykpIChyZXR1cm4gLiBKdXN0KSk7CgoJc2hv
d0lPUyA6OiBTdHJpbmcgLT4gSU8gU3RyaW5nIC0+IElPICgpOwoJc2hvd0lPUyBzIGlvcyA9IGRv
CgkJewoJCXB1dFN0ciAocyArKyAiOgkiKTsKCQltcGUgPC0gZ2V0UHVyZUV4Y2VwdGlvbiBpb3M7
CgkJY2FzZSBtcGUgb2YKCQkJewoJCQlKdXN0IHBlIC0+IHB1dFN0ckxuICgicHVyZSBleGNlcHRp
b24gKCIrKyAoc2hvdyBwZSkgKysiKSIpOwoJCQlOb3RoaW5nIC0+IEV4Y2VwdGlvbi5jYXRjaCAo
UHJlbHVkZS5jYXRjaCAoZG8KCQkJCXsKCQkJCXJlc3VsdCA8LSBpb3M7CgkJCQltcnBlIDwtIGdl
dFB1cmVFeGNlcHRpb24gcmVzdWx0OwoJCQkJY2FzZSBtcnBlIG9mCgkJCQkJewoJCQkJCUp1c3Qg
cGUgLT4gcHV0U3RyTG4gKCJyZXR1cm5lZCBwdXJlIGV4Y2VwdGlvbiAoIisrIChzaG93IHBlKSAr
KyIpIik7CgkJCQkJTm90aGluZyAtPiBwdXRTdHJMbiAoInZhbHVlICgiKysgKHNob3cgcmVzdWx0
KSArKyIpIik7CgkJCQkJfTsKCQkJCX0pIChcZSAtPiBwdXRTdHJMbiAoIklPIGZhaWx1cmUgKCIg
KysgKHNob3cgZSkgKysiKSIpKSApCgkJCQkoXGUgLT4gcHV0U3RyTG4gKCJJTyBvdGhlciBleGNl
cHRpb24gKCIgKysgKHNob3cgZSkgKysiKSIpKTsKCQkJfTsKCQl9OwoKCWV2YWx1YXRlJyA6OiBh
IC0+IElPIGE7CglldmFsdWF0ZScgYSA9IGEgYHNlcWAgcmV0dXJuIGE7CgoJZXZhbHVhdGUnJyA6
OiBhIC0+IElPIGE7CglldmFsdWF0ZScnIGEgPSAoRXhjZXB0aW9uLmNhdGNoIChzZXEgYSAocmV0
dXJuIGEpKSAoXGUgLT4gZmFpbCAoc2hvdyBlKSkpOwoKCW1haW4gOjogSU8gKCk7CgltYWluID0g
ZG8KCQl7CgkJcHV0U3RyTG4gIiogdmFsdWUiOwoJCXNob3dJT1MgInJldHVybiB0ZXh0IgkJCQkJ
CShyZXR1cm4gInRleHQiKTsKCQlzaG93SU9TICJyZXR1cm4gdW5kZWZpbmVkID4+IHJldHVybiB0
ZXh0IgkocmV0dXJuIHVuZGVmaW5lZCA+PiByZXR1cm4gInRleHQiKTsKCQlwdXRTdHJMbiAiIjsK
CgkJcHV0U3RyTG4gIiogcmV0dXJuZWQgcHVyZSBleGNlcHRpb24iOwoJCXNob3dJT1MgInJldHVy
biB1bmRlZmluZWQiCQkJCQkocmV0dXJuIHVuZGVmaW5lZCk7CgkJc2hvd0lPUyAicmV0dXJuIChz
ZXEgdW5kZWZpbmVkIHRleHQpIgkJKHJldHVybiAoc2VxIHVuZGVmaW5lZCAidGV4dCIpKTsKCQlz
aG93SU9TICJyZXR1cm4gKCkgPj4gcmV0dXJuIHVuZGVmaW5lZCIJCShyZXR1cm4gKCkgPj4gcmV0
dXJuIHVuZGVmaW5lZCk7CgkJc2hvd0lPUyAicmV0dXJuIHVuZGVmaW5lZCA+Pj0gcmV0dXJuIgkJ
KHJldHVybiB1bmRlZmluZWQgPj49IHJldHVybik7CgkJcHV0U3RyTG4gIiI7CgoJCXB1dFN0ckxu
ICIqIElPIGZhaWx1cmUiOwoJCXNob3dJT1MgImZhaWwgdGV4dCIJCQkJCQkJKGZhaWwgInRleHQi
KTsKCQlzaG93SU9TICJpb0Vycm9yICh1c2VyRXJyb3IgdGV4dCkiCQkJKGlvRXJyb3IgKHVzZXJF
cnJvciAidGV4dCIpKTsKCQlwdXRTdHJMbiAiIjsKCgkJcHV0U3RyTG4gIiogSU8gb3RoZXIgZXhj
ZXB0aW9uIjsKCQlzaG93SU9TICJ1bmRlZmluZWQgPj4gcmV0dXJuIHRleHQiCQkJKHVuZGVmaW5l
ZCA+PiByZXR1cm4gInRleHQiKTsKCQlzaG93SU9TICJyZXR1cm4gKCkgPj4gdW5kZWZpbmVkIgkJ
CShyZXR1cm4gKCkgPj4gdW5kZWZpbmVkKTsKCQlzaG93SU9TICJpb0Vycm9yIChFcnJvckNhbGwg
dGV4dCkiCQkJKGlvRXJyb3IgKEV4Y2VwdGlvbi5FcnJvckNhbGwgInRleHQiKSk7CgkJc2hvd0lP
UyAiaW9FcnJvciAoQXNzZXJ0aW9uRmFpbGVkIHRleHQpIgkoaW9FcnJvciAoRXhjZXB0aW9uLkFz
c2VydGlvbkZhaWxlZCAidGV4dCIpKTsKCQlwdXRTdHJMbiAiIjsKCgkJcHV0U3RyTG4gIiogcHVy
ZSBleGNlcHRpb24iOwoJCXNob3dJT1MgInVuZGVmaW5lZCIJCQkJCQkJdW5kZWZpbmVkOwoJCXNo
b3dJT1MgInNlcSB1bmRlZmluZWQgKHJldHVybiB0ZXh0KSIJCShzZXEgdW5kZWZpbmVkIChyZXR1
cm4gInRleHQiKSk7CgkJc2hvd0lPUyAic2VxIHVuZGVmaW5lZCAocmV0dXJuIHVuZGVmaW5lZCki
CShzZXEgdW5kZWZpbmVkIChyZXR1cm4gdW5kZWZpbmVkKSk7CgkJc2hvd0lPUyAiZXJyb3IgdGV4
dCIJCQkJCQkoZXJyb3IgInRleHQiKTsKCQlzaG93SU9TICJ0aHJvdyAodXNlckVycm9yIHRleHQp
IgkJCShFeGNlcHRpb24udGhyb3cgKHVzZXJFcnJvciAidGV4dCIpKTsKCQlzaG93SU9TICJ0aHJv
dyAoRXJyb3JDYWxsIHRleHQpIgkJCShFeGNlcHRpb24udGhyb3cgKEV4Y2VwdGlvbi5FcnJvckNh
bGwgInRleHQiKSk7CgkJc2hvd0lPUyAidGhyb3cgKEFzc2VydGlvbkZhaWxlZCB0ZXh0KSIJCShF
eGNlcHRpb24udGhyb3cgKEV4Y2VwdGlvbi5Bc3NlcnRpb25GYWlsZWQgInRleHQiKSk7CgkJcHV0
U3RyTG4gIiI7CgoJCXB1dFN0ckxuICIqIGV2YWx1YXRlIGZ1bmN0aW9ucyI7CgkJc2hvd0lPUyAi
ZXZhbHVhdGUgdW5kZWZpbmVkIgkJCQkoRXhjZXB0aW9uLmV2YWx1YXRlIHVuZGVmaW5lZCk7CgkJ
c2hvd0lPUyAiZXZhbHVhdGUnIHVuZGVmaW5lZCIJCQkJKGV2YWx1YXRlJyB1bmRlZmluZWQpOwoJ
CXNob3dJT1MgImV2YWx1YXRlJycgdW5kZWZpbmVkIgkJCQkoZXZhbHVhdGUnJyB1bmRlZmluZWQp
OwoJCX07Cgl9Cg==
--Emailer_-1188410616--