[Haskell-cafe] First questions!

Miguel Mitrofanov miguelimo38 at yandex.ru
Thu Sep 2 09:59:05 EDT 2010

02.09.2010 16:49, Eoin C. Bairéad пишет:
> Example 2
> Prelude>  let fac n = if n == 0 then 1 else n * fac (n-1)
> How does it know to stop ?

To stop what? It's not "doing" anything, it's just an equation. So "fac" is the "least" function which satisfies this equation - meaning that it's value would be (_|_) (which is a special value called 
"bottom") whenever possible. When you ask for "fac 3", for example, it's not possible for it to be (_|_), because it has to be 3*fac(2), according to this equation; and "fac 2" isn't bottom either, 
because it has to be 2*fac(1); and fac(1) has to be 1*fac(0), which is also not bottom, because the equation states explicitly that fac 0 = 1.

> and why does fac 2.5 hang?

Because there isn't anything to prevent "fac 2.5" from being equal to (_|_); and when you ask for value that happens to be (_|_), your program can either crash or hang forever, it's the only special 
thing about bottom value.

More information about the Haskell-Cafe mailing list