
(Apologies for coming back after 2 weeks)
On 4 Nov 2015, at 19:41, Michael Snoyman
On Wed, Nov 4, 2015 at 9:28 AM, Jules Bean
wrote: On 4 Nov 2015, at 13:04, Michael Snoyman
wrote: This got me curious, so I just added a `sourceToList` function to master:
https://github.com/snoyberg/conduit/commit/289f671cb7669c4aec78d8e77f01f2ace...
Having spent a day thinking this over…
Nothing with the type `Source m a -> m [a]` can work for my second example - the one where I use runExceptionT to discharge the MonadThrow constraint. This is because once you use runExceptionT you have pushed yourself into the situation where in case of error there is no ‘return value’.
I don't think that the Writer example above is demonstrating what you're saying, since you're using imprecise exceptions (`error`) instead of MonadThrow. You could do the same thing with sourceToList and get that result.
There was another example where I don’t use imprecise exceptions, but I use ExceptionT:
source123Throw :: MonadThrow m => Source m Int source123Throw = do yield 1 yield 2 yield 3 throwM MyError
*Main Control.Monad.Except Control.Monad.Trans.Resource> snd . runWriter . runExceptionT $ (source123Throw $$ tellEverything) [1,2,3] The point here is the order of nesting runWriter(T) and runException(T). If you do it this way around the type is `([a],Either Exception ())` and you can just inspect the first element of the tuple to check the list without checking for an error - which allows it to be streaming. `Source m a -> m [a]` can only take this second form. Jules