X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=blobdiff_plain;f=coroutines_and_aborts.mdwn;h=2ab7876322386980ad772e5dfbc2caadd1e1feae;hp=a0b35c8891c7747f8b51e6b3f3aeba4851a8c5f9;hb=7a822d410076318ea12be4e3cdb57e1b91218f42;hpb=69b3f8c86471cc4473813e90d2db9b5540a111fe diff --git a/coroutines_and_aborts.mdwn b/coroutines_and_aborts.mdwn index a0b35c88..2ab78763 100644 --- a/coroutines_and_aborts.mdwn +++ b/coroutines_and_aborts.mdwn @@ -338,7 +338,27 @@ So what I should have said is that when you evaluate the expression: *and that exception is never caught*, then the effect is for the program to immediately stop. -Of course, it's possible to handle errors in other ways too. There's no reason why the implementation of `List.nth` *had* to do things this way. They might instead have returned `Some a` when the list had an nth member `a`, and `None` when it does not. But it's pedagogically useful for us to think about this pattern now. +Trivia: what's the type of the `raise (Failure "two")` in: + + if x = 1 then 10 + else raise (Failure "two") + +What's its type in: + + if x = 1 then "ten" + else raise (Failure "two") + +So now what do you expect the type of this to be: + + fun x -> raise (Failure "two") + +How about this: + + (fun x -> raise (Failure "two") : 'a -> 'a) + +Remind you of anything we discussed earlier? /Trivia. + +Of course, it's possible to handle errors in other ways too. There's no reason why the implementation of `List.nth` *had* to raise an exception. They might instead have returned `Some a` when the list had an nth member `a`, and `None` when it does not. But it's pedagogically useful for us to think about the exception-raising pattern now. When an exception is raised, it percolates up through the code that called it, until it finds a surrounding `try ... with ...` that matches it. That might not be the first `try ... with ...` that it encounters. For example: @@ -383,7 +403,7 @@ Many programming languages have this simplified exceution pattern, either instea if (x == 1) then value = 10 else - return 20 -- return early + return 20 -- abort early end return value + 100 -- in Lua, a function's normal value -- must always also be explicitly returned