let sa = [ 1 .. 10 ]

let rec fold f s xs = 
   match xs with 
   | [] -> s
   | x::xs  ->  fold  f (f s x) xs
fold (+) 0 sa

let rec foldps f s xs k = 
   match xs with 
   | [] -> k s 
   | x::xs  -> foldps f s xs (fun s  -> f x s k)  

let pluscps = (fun x s cont -> cont(s + x))
foldps pluscps 0 sa id

let rec foldpsn fs s xs k = 
   match xs with 
   | [] -> k s 
   | x::xs  -> match fs with
               | f::[] -> foldps  f  s xs (fun s  -> f x s k)
               | f::fs -> foldpsn fs s xs (fun s  -> f x s k)
               | _     -> failwith "not good"


let printcps = (fun x s cont -> printfn "%A" x;cont(s))
foldpsn [printcps;pluscps] 0 sa id