main Where Let (main args) (MAIN.run Match (MAYBE.bind1 (LIST.fetch args 1) Z.read) | `nothing (MAIN.die "Expected a number argument.") | `just.n (MAIN.sequence3 (MAIN.print_line (Z.show (factorial1 n))) (MAIN.print_line (Z.show (factorial2 n))) (MAIN.print_line (Z.show (factorial3 n)))) ;) Where Define (factorial1 n) If (n <= 1) 1 (n * (factorial1 (n - 1))) Let (factorial2 n) Iterate {f m} From {1 2} If (m > n) f Continue {(f * m) (m + 1)} Let (factorial3 n) (Z.fold n 1 Func m mfact. ((m + 1) * mfact)) Where Let LIST Package "list" Let MAIN Package "main" Let MAYBE Package "maybe" Let Z Package "z"