(* Standard prelude *) let I x = x ;; (* identity *) let A f = I o f ;; (* P->A functor *) let T f x = /f x ;; (* raising A->P for 1-arg functions *) let T2 f x y = /f x y ;; (* -- for 1-2-arg functions *) let rec it_list *f = \ [] (* list iterator *) | [h|t]; f h; it_list f:f t ;; let rec list_it *f = \ [] (* reverse order *) | [h|t]; list_it f:f t; f h ;; let rec fold *f = \ [] ; /[] | [h|t] ; f h; \x ; fold f:f t ; T(cons x) ;; let rec map *f = \ []; [] | [h|t]; (f h)::map f:f t ;; let rec while *do *end = end; \ ok:false | ok:true; do ; while do:do end:end ;; let rec repeat *f = \ 0 | n; f; repeat f:f (n-1);; let length = A(it_list f:(\_;T(add 1)) 2:0) ;; let rec append = \ [] ; I | [h|t], l ; h::append t l;; let rec combine = \ [], [] ; [] | [h|t], [h'|t'] ; ::combine t t' ;;