
Conor McBride writes:
magic :: Zero -> a magic _ = error "There's magic, as no such thing!"
It's a little frustrating to have to define this function lazily. I prefer the strict definition with no lines, but it isn't valid Haskell!
I think you could avoid that frustration by defining Zero/Void/Bikeshed
liko so:
newtype Void = Void { avoid :: forall a. a }
That gets you a strictly defined avoid and emphasizes that Void is
isomorphic to (forall a. a).
On a semi-related note, how about instances for the Prelude classes?
For example,
instance Show Void where
show = avoid
instance Read Void where
readsPrec _ _ = []
instance Eq Void where
a == b = avoid a
instance Ord Void where
compare a b = avoid a
Enum and Bounded are out, because they have methods which produce
values, but Data and Typeable instances might be reasonable.
--
David Menendez