From: Jim Pryor Date: Mon, 4 Oct 2010 12:51:54 +0000 (-0400) Subject: library: added Oleg's revappend X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=commitdiff_plain;h=8ef02c87c6608f870322ca38033c372b50890ef2 library: added Oleg's revappend Signed-off-by: Jim Pryor --- diff --git a/lambda_library.mdwn b/lambda_library.mdwn index 2e65f5cc..579668be 100644 --- a/lambda_library.mdwn +++ b/lambda_library.mdwn @@ -63,8 +63,12 @@ and all sorts of other places. Others of them are our own handiwork. ; very inefficient but correct reverse let reverse = \lst. lst (\h sofar. append sofar (singleton h)) empty in ; or ; 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)) + ; 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 + ; most elegant + ; revappend [a;b;c] [x;y] ~~> [c;b;a;x;y] + let revappend = \lst. lst (\hd sofar. \lst. sofar (make_list hd lst)) I in + let rev = \lst. revappend lst empty 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