
Firstly I'm assuming that GHC's strictness analyser notices things like (bottom = bottom) or could easily do so - please correct me if I'm wrong. GHC in its RTS already throws Nontermination exception in some cases. I think it would be nice if, when the compiler detected nontermination, to replace it with an exception and emit a warning message (hmm... if GHC Core loses source code information, a warning message might be difficult). Is there any intentional use of certain nontermination? This is inspired by the problem that supplying default definitions for class methods that refer to each other (such as Eq's (==) and (/=)), doesn't warn you if you don't define them and only yields your program not to terminate, when you run it! (noticed on haskell-prime list.) Even if it can't be detected automatically, maybe a pragma for classes to tell the compiler what documentation often tells users: {-# MINIMAL_INSTANCE Eq (==) OR (/=) #-} or for Data.Bits.Bits "Minimal complete definition: .&., .|., xor, complement, (shift or (shiftL and shiftR)), (rotate or (rotateL and rotateR)), bitSize and isSigned. " {-# MINIMAL_INSTANCE Bits (.&.) AND (.|.) AND xor AND complement AND (shift OR (shiftL AND shiftR)) AND (rotate OR (rotateL AND rotateR)) AND bitSize AND isSigned #-} Except that Bits is a stupid class in which you're *supposed to* leave bitSize undefined for unlimited-precision types like Integer... GHC already warns if you don't define bitSize... Maybe "AND" --> "," , "OR" --> "|" or something Thoughts? Isaac