# [Haskell-cafe] First questions!

Andrew Coppin andrewcoppin at btinternet.com
Thu Sep 2 13:33:42 EDT 2010

```Eoin C. Bairéad wrote:
> Example 2
>
> Prelude> let fac n = if n == 0 then 1 else n * fac (n-1)
>
> How does it know to stop ?
>

Becuase you said "if n == 0 then 1". In other words, if n is zero then
return one and stop. Only if n does *not* equal zero does it recursively
so "n * fac (n-1)".

> and why does fac 2.5 hang?
>

Because the n == 0 condition never holds. fac 3 yields n=3, n=2, n=1,
n=0, stop. fac 2.5 yeilds n=2.5, n=1.5, n=0.5, n=-0.5, n=-1.5... forever.

Note carefully that fac (-6) also loops forever.

Now, if you were to change the condition to "n < 1" rather than "n == 0"
then it would halt in all circumstances. You could also use a type
signature to state that fac accepts only whole numbers, since this
function only gives a meaningful answer in that case.

(If you wanted a mathematically correct function, you need the Gamma
function. But that's scary stuff, and this is a Haskell lesson not an
advanced math lesson.)

```

More information about the Haskell-Cafe mailing list