I'm working on a library which needs to operate on large data sets, so
I'd like to use lazy values. ...
----------------------------------------
import qualified Data.Text as T
parse :: TL.Text -> [Either ParseError Event]
----------------------------------------

I would say that this is the most desirable approach, if you are generating a sequence, and want lazy processing of the elements. Indeed, in my own experience, this is the only reasonable way to deal with very large datasets, without running out of memory.

The main problem I see with these is that they don't indicate or
enforce that an error terminates the event/text streams. The first
allows multiple errors in a row, or events to follow an error.

Are you sure that there can be no error recovery, to continue with events after a mal-formed event has been discarded? In many cases, it is possible. However, if you really want to terminate the stream at the first error, and to reflect this in the type, then I guess you can define your own list type:

data ListThenError e a = Cons a (ListThenError e a)
                       | Error e

Of course this has the disadvantage that then your consumer must change to use this type too.

Regards,
    Malcolm

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to