[Haskell-cafe] Proposal: Non-recursive let

John van Groningen johnvg at cs.ru.nl
Tue Jul 23 15:31:39 CEST 2013


On 22-7-2013 17:09, i c wrote:
> On Wed, Jul 10, 2013 at 9:47 AM,<oleg at okmij.org>  wrote:
>
>>
>> Jon Fairbairn wrote:
>>> It just changes forgetting to use different variable names because of
>>> recursion (which is currently uniform throughout the language) to
>>> forgetting to use non recursive let instead of let.
>>
>> Let me bring to the record the message I just wrote on Haskell-cafe
>>
>> http://www.haskell.org/pipermail/haskell-cafe/2013-July/109116.html
>>
>> and repeat the example:
>>
>> 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 ...
>>
>> and re-number them if I insert a new statement.

Not if you use pattern guards:

{-# LANGUAGE PatternGuards #-}

	| ~(x,s) = foo 1 []
	, ~(y,s) = bar x s
	, ~(z,s) = baz x y s
	= ...

> Usage of shadowing is generally bad practice. It is error-prone. Hides
> obnoxious bugs like file descriptors leaks.
> The correct way is to give different variables that appear in different
> contexts a different name, although this is arguably less convenient and
> more verbose.
>
>
>
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe





More information about the Haskell-Cafe mailing list