[Haskell-cafe] Documenting the impossible

Andrew Coppin andrewcoppin at btinternet.com
Sat Jun 14 14:58:07 EDT 2008


I have a small idea. I'm curios if anybody else thinks it's a good idea...

How about a {-# IMPOSSIBLE #-} pragma that documents the fact that a 
particular point in the program *should* be unreachable?

For example, you look up a key in a Map. You know the key is there, 
because you just put it there yourself two seconds ago. But, 
theoretically, lookup returns a Maybe x so - theoretically - it's 
possible it might return Nothing. No matter what you do, GHC will insert 
code to check whether we have Just x or Nothing, and in the Nothing case 
throw an exception.

Obviously there is no way in hell this code path can ever be executed. 
At least, assuming your code isn't broken... This is where the pragma 
comes in. The idea is that you write something like

  case lookup k m of
    Just v -> process v
    Nothing -> {-# IMPOSSIBLE "lookup in step 3" #-}

When compiled without optimisations, the pragma just causes an exception 
to be thrown, rather like "error" does. When compiled with 
optimisations, the whole case alternative is removed, and no code is 
generated for it. (And if the impossible somehow happens... behaviour is 
undefined.) So you test your program with your code compiled 
unoptimised, and when you're "sure" the impossible can't happen, you 
tell the compiler to remove the check for it. (Actually, it would 
possibly be a good idea to have a switch to turn this on and off 
seperately if needed...)

Does anybody think this is a useful idea? If so I'll add a feature 
request ticket to the GHC Trac. But I want to see if folks like the idea 
first...

(I was thinking the message in the pragma would be what gets displayed 
on screen, along with some auto-generated location info. Just a module 
name and line number ought to be sufficient...)



More information about the Haskell-Cafe mailing list