En plus, ca affiche la trace du calcul en cours..

import Control.Monad.State

fact :: Int -> (Int,[Int])
fact i = ((evalState r []),(reverse $ execState r [])) where
  r = (aux i 1)
  aux :: Int -> Int -> State [Int] Int
  aux i r = if i <= 1
      then do
        x<- get
        put(r:x)
        return r
      else do
       l <- get
       put (r:l)
       aux (pred i) (r*i)

P!