<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Nov 4, 2015 at 9:28 AM, Jules Bean <span dir="ltr"><<a href="mailto:jules@jellybean.co.uk" target="_blank">jules@jellybean.co.uk</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><br><div><span class=""><div>On 4 Nov 2015, at 13:04, Michael Snoyman <<a href="mailto:michael@snoyman.com" target="_blank">michael@snoyman.com</a>> wrote:</div><br></span><span class=""><blockquote type="cite"><div dir="ltr">This got me curious, so I just added a `sourceToList` function to master:<div><br></div><div><a href="https://github.com/snoyberg/conduit/commit/289f671cb7669c4aec78d8e77f01f2ace165d73a" target="_blank">https://github.com/snoyberg/conduit/commit/289f671cb7669c4aec78d8e77f01f2ace165d73a</a><br></div></div></blockquote></span></div><br><div>Having spent a day thinking this over…</div><div><br></div><div>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’. </div><div><br></div><div>It’s not that I care about that per se - if there is an error then the return value is no use to me - but unfortunately that has knock-on implications on laziness.</div><div><br></div><div>The Writer monad solution pushes out the return value incrementally by a ‘side-channel’ rather than using the return value and it’s that property which lets it work even in the presence of runExceptionT.</div><div><br></div><div>Another approach which would work though is to provide a newtyped Identity monad which handles MonadThrow by _|_, which would allow you to regain laziness (?)</div><span class="HOEnZb"><font color="#888888"><div><br></div><div>Jules</div><div><br></div></font></span></div></blockquote></div><br></div><div class="gmail_extra"><br></div><div class="gmail_extra">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.</div><div class="gmail_extra"><br></div><div class="gmail_extra">You're also correct that some kind of a Identity monad with a MonadThrow instance based on `throw` would allow this to work.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Michael</div></div>