
On Wed, 12 Mar 2008, Donn Cave wrote:
On Mar 12, 2008, at 2:10 PM, Henning Thielemann wrote:
On Wed, 12 Mar 2008, Donn Cave wrote:
On Mar 12, 2008, at 12:32 PM, Brandon S. Allbery KF8NH wrote:
Sure. It isn't a lot of code, so I subjected it to Either-ization as an experiment, and I did indeed take the monad procedural route. Monad != procedural, unless you insist on do notation. Think of it as composition (it may be easier to use (=<<) which "points the same
On Mar 12, 2008, at 14:17 , Donn Cave wrote: direction" as (.)).
Yes, I insist on do notation, because it provides a convenient binding form that works with what I'm doing - the original functional variation wasn't so suited to composition either, and used `let'.
But I see that as only syntactic - equally procedural, either way. Expressions are evaluated in a fixed order,
Do notation only looks like there are statements that are processed from the beginning to the end. But that's not true, it's still purely lazy and expressions are evaluated in the order that is forced by data dependencies.
Let me put it this way: if I write
do (i, s') <- decodeInt s (v, _) <- decodeInt s' return (i, v)
... instead of, to just avoid the monad stuff
case (decodeInt s) of Left e -> Left e Right (i, s') -> case (decodeInt s') of Left e -> Left e Right (v, _) -> Right (i, v)
Since the decision between Left and Right requires all parts to be evaluated, it's Either that might too strict for your application. What about a writer monad, where exceptions, or better say warnings, are written to the writer stream?