let make_list = \h t f z. f h (t f z) in
let isempty = \lst. lst (\h sofar. false) true in
let head = \lst. lst (\h sofar. h) junk in
- let tail = \lst. (\shift lst. lst shift (make_pair empty junk) get_2nd)
+ let tail_empty = empty in
+ let tail = \lst. (\shift. lst shift (make_pair empty tail_empty) get_2nd)
; where shift is
(\h p. p (\t y. make_pair (make_list h t) t)) in
let length = \lst. lst (\h sofar. succ sofar) 0 in
; append list2 to list1 with: list1 make_list list2
let singleton = \x f z. f x z in
let reverse = \lst. lst (\h sofar. sofar make_list (singleton h)) empty in
- let zip = \left right. left (\h sofar. sofar (\x y. isempty y
- sofar
- (make_pair (make_list (\u v. head y (u v) h) x) (tail y))
- )
- (make_pair empty (map right (\h u v. u v h)))
- )
- (\x y. reverse x) in
+ ; 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))
+ ; and build is
+ (\h sofar. sofar (\x y. isempty y
+ sofar
+ (make_pair (make_list (\u. head y (u h)) x) (tail y))
+ )) in
+
let all = \f lst. lst (\h sofar. and sofar (f h)) true in
let any = \f lst. lst (\h sofar. or sofar (f h)) false in