[Haskell-cafe] On syntactic sugar

Lauri Oksanen lassoken at gmail.com
Mon May 12 12:41:55 EDT 2008


Hi,

I'm writing my first real Haskell program and I came up with the following
code snippet.

---
let x' = x \+ dist \* dir
    nx' =  normal geometry
    wi = (-1) \* dir
    in do
        (p, wo) <- brdfCosSampling reflector nx' wi
        let color' = p \** color
            q = min 1 (scalarContribution p)
            in do
                sampler <- biasedCoinSampler q
                        (radianceSampler surfaces x' wo (q \* color'))
                        (terminalRadianceSampler surfaces x' nx' ((1-q) \*
color'))
                sampler
---

This works just fine but I don't like the way I had to indent the code
because of alternating lets and dos.
I would like to indent the code more like an imperative code i.e. like this

---
let {
    x' = x \+ dist \* dir ;
    nx' =  normal geometry ;
    wi = (-1) \* dir ;
} in do {
    (p, wo) <- brdfCosSampling reflector nx' wi ;
let {
    color' = p \** color ;
    q = min 1 (scalarContribution p) ;
} in do {
    sampler <- biasedCoinSampler q
            (radianceSampler surfaces x' wo (q \* color'))
            (terminalRadianceSampler surfaces x' nx' ((1-q) \* color')) ;
    sampler ;
}}
---

but without braces and semicolons. Following works also, but is ugly (and
probably less efficient?).

---
do
    x' <- return $ x \+ dist \* dir
    nx' <- return $  normal geometry
    wi <- return $ (-1) \* dir
    (p, wo) <- brdfCosSampling reflector nx' wi
    color' <- return $ p \** color
    q <- return $ min 1 (scalarContribution p)
    sampler <- biasedCoinSampler q
            (radianceSampler surfaces x' wo (q \* color'))
            (terminalRadianceSampler surfaces x' nx' ((1-q) \* color'))
    sampler
---

Is there some nice trick to do this?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20080512/dd072011/attachment-0001.htm


More information about the Haskell-Cafe mailing list