let empty = \f n. n in
let cons = \x xs. \f n. f x xs in
let empty? = \xs. xs (\y ys. false) true in
+ let head = \xs. xs (\y ys. y) err in
let tail = \xs. xs (\y ys. ys) empty in
let append = Y (\append. \xs zs. xs (\y ys. (cons y (append ys zs))) zs) in
let take_while = Y (\take_while. \p xs. xs (\y ys. (p y) (cons y (take_while p ys)) empty) empty) in