I think that a non-non recursive let could be not compatible with the pure nature of Haskell.
 
Let is "recursive" because, unlike in the case of other languages, variables are not locations for storing values, but the expressions on the right side of the equality themselves. And obviously it is not possible for a variable-expression to be two expressions at the same time. The recursiveness is buildt-in. It comes from its pure nature.
 
For a non recursive version of let, it would be necessary to create a new closure on each line, to create a new variable-expression with the same name, but within the new closure. A different variable after all. That is what the example with the Identity (and the state monad) does. 
 
So I think that the ugly return example or the more elegant state monad alternative is the right thing to do.


2013/7/10 Ertugrul Söylemez <es@ertes.de>
oleg@okmij.org wrote:

> Hear, hear! In OCaml, I can (and often do) write
>
>         let (x,s) = foo 1 [] in
>         let (y,s) = bar x s in
>         let (z,s) = baz x y s in ...
>
> In Haskell I'll have to uniquely number the s's:
>
>         let (x,s1)  = foo 1 [] in
>         let (y,s2)  = bar x s1 in
>         let (z,s3)  = baz x y s2 in ...

This isn't a case for non-recursive let.  It is one of the rare cases
where you might actually consider using a state monad.


Greets,
Ertugrul

--
Not to be or to be and (not to be or to be and (not to be or to be and
(not to be or to be and ... that is the list monad.

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe




--
Alberto.