# [erlang-questions] newbie question of if guards

Hal Snyder <>
Mon Dec 11 03:02:01 CET 2006

...
Sqrt_Iter =
fun (Guess,G) ->
case (Good_Enough(Guess)) of
true -> Guess;
false -> G(Improve(Guess),G)
end
end,

Sqrt_Iter(1.0, Sqrt_Iter).

On Dec 10, 2006, at 6:37 PM, Chris Rathman wrote:

> Thanks for the answers (from Mathias and Kostis)!  That gets me
> further
> along.
>
> As long as I'm asking annoying newbie questions and I'm on the
> pedagogic
> subject of square roots....  :-)
>
> I'm trying to figure out the way Erlang does nested functions.  From
> what I gather, anonymous functions would be the way to go.
> Unfortunately, I can't figure out how to make the lambda functions be
> recursive, and searches for 'Erlang' and 'fun' don't narrow it down
> enough.  Here's what I am trying to do:
>
> sqrt(X) ->
>    Good_Enough =
>       fun (Guess) ->
>          abs(square(Guess) - X) < 0.001
>       end,
>
>    Improve =
>       fun (Guess) ->
>          average(Guess, X / Guess)
>       end,
>
>    Sqrt_Iter =
>       fun (Guess) ->
>          case (Good_Enough(Guess)) of
>             true -> Guess;
>             false -> Sqrt_Iter(Improve(Guess))
>          end
>       end,
>
>    Sqrt_Iter(1.0, X).
>
> The recursive call in Sqrt_Iter gives me an error informing me that it
> is unbound.  I can understand why it is unbound, but I was
> wondering if
> there's something similar to CaML's 'rec' modifier?  Or is there
> another
> Erlang idiom for achieving this effect?
>
> Thanks,
> Chris Rathman
>
> Matthias Lang wrote:
>> Erlang does not allow calling arbitrary functions from guards.
>>
>> One way to achieve what you're attempting below is to use 'case'