Rather than Nothing/0/NaN etc. (the first option being way better than the others), it would be great to generalize code that may throw to the MonadThrow class from exceptions.
This way, functions using throwM (e :: Exception) would have the signature MonadThrow m => ... -> m ( ... ), where m may become Maybe, or Either e, or even IO, according to the calling context.
Rather than Nothing/0/NaN etc. (the first option being way better than the others), it would be great to generalize code that may throw to the MonadThrow class from
exceptions.This way, functions using
throwM (e :: Exception)would have the signatureMonadThrow m => ... -> m ( ... ), wheremmay becomeMaybe, orEither e, or evenIO, according to the calling context.