[Haskell-cafe] Exception handling when using STUArray
Donn Cave
donn at avvanta.com
Thu Mar 13 13:38:34 EDT 2008
On Mar 12, 2008, at 11:23 PM, Luke Palmer wrote:
>
> The issue is that exception handling semantics do induce an order of
> evaluation for determinacy: if both functions in a composition throw
> an exception at some point (say in the 3rd element of a list they're
> generating), you need to decide which exception ends up being thrown,
> and to do that based on the lazy evaluation order would break
> referential transparency.
OK, that is what I was getting several years ago when I brought this
up, but ... check my reasoning on this.
Maybe a contrived example of what you're talking about, if I write
f _ [] = []
f n (a:x) = (div 3 n, j a):(f (n - 1) x)
where
j (Just v) = v
main = print $ f 2 [Just 1, Just 2, Nothing]
Running it, I'll hear about a divide by zero on the 3rd element,
and not hear about the Just match failure on the 3rd element.
Suppose you model exceptions with an data type X that implicitly
describes all expressions in Haskell:
data X a = Good a | Bad String
such that a partial explicit expansion of the above is
f _ [] = []
f n (a:x) = (div 3 n, j a):(f (n - 1) x)
where
j (Just v) = Good v
j Nothing = Bad "X.hs:15:0-27: Non-exhaustive patterns
in function j"
div a 0 = Bad "divide by zero"
div a b = Good (div a b)
The expanded result of (f 2 [Just 1, Just 2, Nothing]) will be
[(Good 1, Good 1), (Good 3, Good 2), (Bad "divide by zero", Bad
"X.hs:15:0-27: Non-exhaustive patterns in function j")]
My IO action (print) had to decide to throw "divide by zero", but
arbitrary decisions like that are common and don't make the underlying
principle unsound. Am I missing something, or is that a suitable
model for pure, non-strict exceptions that could in principle be
caught outside IO?
(Of course, I do _not_ propose to write code per the expanded
example above - that's only a partial expansion, and already too
cumbersome to be useful. It's only a conceptual model.)
Donn Cave, donn at avvanta.com
More information about the Haskell-Cafe
mailing list