nil :: intlist cons :: Int → intlist → intlist fact :: Int → Int fact(n) → 1 | n ≤ 0 fact(n) → n * fact2(n - 1) | n > 0 fact2 :: Int → Int fact2(n) → fold([*], 1, genlist(n)) genlist :: Int → intlist genlist(n) → nil | n ≤ 0 genlist(n) → cons(n, genlist(n-1)) | n > 0 fold :: (Int → Int → Int) → Int → intlist → Int fold(f, y, nil) → y fold(f, y, cons(x, l)) → f(x, fold(f, y, l))