[Haskell-cafe] Question regarding let clauses

Daniel Fischer daniel.is.fischer at web.de
Thu Mar 9 10:28:37 EST 2006


Am Donnerstag, 9. März 2006 14:04 schrieb Martin Percossi:
> Hello, the following code doesn't compile
<snip>
> matMul :: MMatrix s -> MMatrix s -> ST s (MMatrix s)
> --matMul a b = do let foo = 2*5
>                 --return a
> matMul a b = do { let foo = 2*5; return a }
> </snip>
>
> under ghc 6.4.1, yielding the error message:
>
> question.hs:25:41: parse error on input `<-'
> Failed, modules loaded: none.
?? my error message is what I expect:
Matrix.hs:25:42: parse error on input `}'
Failed, modules loaded: none.

There's no '<-' around.

>
> The offending is line the one containing "let foo = 2*5", which is a little
> test I've done of let-clauses. Now, suppose instead that for the last
> function, matMul, I replace the version that's commented out.  No errors!
>
> Could someone enlighten me as to why? I'm a bit confused, as I thought the
> two forms are equivalent save for formatting...

The offending line is parsed as 
matMul a b = do { let { foo = 2*5; return a } } (cf. Sec. 9.3 of the report),
which obviously doesn't make sense. This is because let expressions extend as 
far to the right as possible and separating local bindings by ';' is 
legitimate, so the parser tries to parse a binding for return after the 
semicolon, and fails. It isn't smart enough to then backtrack and let the 
let-binding end at the semicolon.
This is one of the dangers of mixing explicit braces and layout.
In the other version, layout leads to correct parsing, as will replacing the 
semicolon with an 'in' or changing the layout to
matMul a b = do { let foo = 2*5
                ; return a }

I suggest using semicolons only as the first token on a line, aligned below 
the opening brace, then all's well.

>
> This is on the back of a email discussion that I was reading about
> let-clauses, in which someone declared that they where better than where
> clauses for monadic code. If anyone could comment on this, I'd appreciate
> it as well.
>
> Many thanks in advance,
> Martin

Cheers, 
Daniel

-- 

"In My Egotistical Opinion, most people's C programs should be
indented six feet downward and covered with dirt."
	-- Blair P. Houghton



More information about the Haskell-Cafe mailing list