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?