; more efficient reverse builds a left-fold instead
; (make_left_list a (make_left_list b (make_left_list c empty)) ~~> \f z. f c (f b (f a z))
let reverse = (\make_left_list lst. lst make_left_list empty) (\h t f z. t f (f h z)) in
- ; zip [a;b;c] [x; y; z] ~~> [(a,x);(b,y);(c,z)]
+ ; zip [a;b;c] [x;y;z] ~~> [(a,x);(b,y);(c,z)]
let zip = \left right. (\base build. reverse left build base (\x y. reverse x))
; where base is
(make_pair empty (map (\h u. u h) right))