I'm with the Option 2 Zap MonadZero Today lobby.
I dislike ~ patterns for all sorts of reasons (won't drag up all *that*
again now!) but that the introduction or elimination of a ~ can alter
the *type* of an expression is particularly horrible.
The attempt to introduce notions of guaranteed evaluation in types is
something we have already backed off for Haskell '98 (eg. class Eval).
Haskell '98 does not attempt to distinguish non-empty or infinite lists
in the static type system, despite the extra guarantees this could
give. Nor does it attempt to distinguish total from partial functions
(eg by pattern coverage) in the static type system, ditto. So arguably
MonadZero is just a complicating anomaly.
As Eric says, there is a trade-off between the extent of static
guarantees on the one hand and pragmatic simplicity on the other.
I am unashamedly in favour of pragmatic simplicity, particularly when
the type system is already quite complex for widespread use.
Option 2. Zap!
Colin R