
On 1 Dec 2004, at 00:37, Marcin 'Qrczak' Kowalczyk wrote:
Ben Rudiak-Gould
writes: I may be confused, but I don't think it does. It seems like the OP wants a type like
data Perhaps a = Success a | Failure [Error]
When writing a compiler, it makes sense to collect errors as by the writer monad, and not abort anything - producing dummy values instead (except perhaps some fatal errors when it's inconvenient).
Or you could use the monad: data Perhaps a = Success a | Failure a [Error] instance Monad Perhaps where Success a >>= k = k a Failure a es >>= k = Failure (value (k a)) (errors (k a) ++ es) where value Success b = b value Failure b _ = b errors Success _ = [] errors Failure _ fs = fs ...such that failures must also produce a value (which could be some approximating 'best guess' based on incorrect input, or some simple default value). This is just a special case of the writer monad, I think. Jules