wrap = dup nil; cons, consi = cons^o, snoci = snoc^o, subr = assocl; (swap * id); assocr, trans = assocr; (id * subr); assocl, distr = (delta * id); trans, eq = delta^o, zip = %(x: (nil^o * nil^o); eq; nil | (cons^o ** cons^o); trans; (id * x); cons), unzip = zip^o, myId = id, map(f) = %(x: nil^o; nil | cons^o; (f * x); cons), foldr(f,g) = %(x: nil^o; g | cons^o; (id * x); f), snoc = %(x: (dup nil)^o; dup nil; cons | (id * cons^o); subr; (id * x); cons), rev = foldr(snoc,nil), mapdfst = %(x: nil^o; nil | cons^o; (dup (fst) * x); cons), toc = map(dup(fst)); unzip; swap, toc2 = map(dup(fst)); unzip, merge = %(x: (dup nil)^o; map(inl) | swap; (dup nil)^o; map(inr) | (cons^o * cons^o); trans; ((leq * id); assocr; (id * subr;(id * cons);x);(inl * id) | (gt * id); (swap*id); assocr; (id * assocl;(cons * id);x);(inr * id)); cons), unmerge = merge^o .