Apparently this<p><pre><code>  s f g x = f x (g x)
  k x y   = x
  b f g x = f (g x)
  c f g x = f x g
  y f     = f (y f)
  cond p f g x = if p x then f x else g x
  fac  = y (b (cond ((==) 0) (k 1)) (b (s (*)) (c b pred)))
</code></pre>
is faster than this<p><pre><code>  facAcc a 0 = a
  facAcc a n = facAcc (n*a) (n-1)
  fac = facAcc 1
</code></pre>
and these are the first and second fastest.<p>&gt; Interestingly, this is the fastest of all of the implementations, perhaps reflecting the underlying graph reduction mechanisms used in the implementation.<p>Could anyone elaborate on this a bit more?