[Haskell-cafe] Re: monad subexpressions

Claus Reinke claus.reinke at talk21.com
Fri Aug 3 11:29:32 EDT 2007

>>> can you please rewrite *p++=*q++ in haskell?
>>     do { w p =<< r q; i p; i q }
> how about *Object.File.Line.CurPtr++ = *AnotherObject.File.Line.CurPtr++  ? ;)

what's the difference?-)

    let p = Object.File.Line.CurPtr
    let q = AnotherObject.File.Line.CurPtr
    do { w p =<< r q; i p; i q }

the other line-noise version i gave does't even need the lets to 
avoid duplicating long names:

    i Object.File.Line.CurPtr =: (r `ap1` i AnotherObject.File.Line.CurPtr)

but this is rapidly approaching the level at which my brain calls for 
a separation of concerns. there are oneliners that make code more 
obvious, and there are oneliners that make code harder to read. and 
definitions of hard/obvious differ..
> the problem with Haskell is that we need to split C expression into
> several statements and explicitly specify execution order even when we
> know that it doesn't matter. ideally, it should be possible to define
> ++x = modifyIORef x (+1) >> readIORef x
> *x  = readIORef x

apart from the prefix symbols (i used one-letter prefix names), you 
can (as i'm sure you know). and the point of my little exercise was to 
show that instead of doing the splitting by hand at each usage site, 
we can write lifting combinators that do the splitting behind the scenes.
what gives haskell aspirations to be a fine imperative language is that
its abstraction mechanisms work as well for imperative code as for
functional code.


More information about the Haskell-Cafe mailing list