3 ms·
They are more comparable to Oleg's Enumerators (http://okmij.org/ftp/Haskell/Iteratee/describe.pdf http://okmij.org/ftp/Haskell/Iteratee/describe.pdf), in that
by jamii 12y ago
They are more comparable to Oleg's Enumerators (http://okmij.org/ftp/Haskell/Iteratee/describe.pdf http://okmij.org/ftp/Haskell/Iteratee/describe.pdf), in that you compose a series of computations and then push data through them. The type signature is similar:
type Iteratee el m a -- a processor of 'els' in the monad 'm' returning a type 'a'
type Enumerator el m a = Iteratee el m a -> m (Iteratee el m a)
The Enumerators library is complicated by the presence of monads and by trying to automatically close handles when the stream is processed. In some ways it seems that the goal of solving the lazy IO problem led to missing a much simpler abstraction. Transducers seem to be simpler and more focused on just abstracting stream/map-reduce computation.
- richhickey 12y agoWhile not mentioned in the blog post, the transducers implementation supports both early termination and result completion/flushing/cleanup.
- dons 12y agothere does seem to be some overlap with stream fusion -- which was all about exploiting the optimization opportunities when separating the collection operation from the kernel performed on each element. We called the bits in the middle "step functions" , which could be combined with "consumers", "producers" and "transformers". And the algebra generalizes hugely (not just collections) but to things like concurrent processes, data flow programs etc. http://metagraph.org/papers/stream_fusion.pdf http://metagraph.org/papers/stream_fusion.pdf Things to think about in a non-Haskell settings: how do you prevent reordering side-effects? Can execeptions/non-termination being reordered be observed?