Document directory
- Haskell code
- F # code
- C ++ auxiliary functions
- C ++ code 1
- C ++ Code 2
Haskell code Cfold2 f z [] = z <br/> cfold2 f z (X: XS) = f x Z (/Y-> cfold2 f y XS) <br/> cfold f z l = cfold2 (/x T g-> f x (g t) z l </P> <p> CPS> cfold (+) 0 [,] <br/> 10 <br/> CPS> cfold2 (/x T g-> (X: g t, 3, 4] <br/> [1, 2, 4] <br/> CPS> cfold2 (/x T g-> G (x: t, 3, 4] <br/> [4, 3, 2, 1]F # code Let rec cfold2 F z = function <br/> | []-> Z <br/> | X :: XS-> f x Z (fun y-> cfold2 f y XS) <br/> let cfold f z l = cfold2 (fun x T g-> f x (g t) z l </P> <p> cfold (+) 0 [1; 2; 3; 4]; <br/> Val IT: Int = 10 <br/> cfold2 (fun x T g-> (X :: g t) [] [1; 2; 3; 4]; <br/> Val IT: int list = [1; 2; 3; 4] <br/> cfold2 (fun x T g-> G (x: t) [] [1; 2; 3; 4]; <br/> Val IT: int list = [4; 3; 2; 1]C ++ auxiliary functions // Utility. h </P> <p> List <int> cons_op (int I, list <int> L) <br/>{< br/> L. push_front (I); <br/> return l; <br/>}</P> <p> ostream & operator <(ostream & OS, const list <int> & L) <br/> {<br/> OS <'['; <br/> for (list <int> :: const_iterator it = L. begin ();) {<br/> OS <* It ++; <br/> If (IT = L. end () break; <br/> OS <','; <br/>}< br/> return OS <']'; <br/>}< br/>C ++ code 1 # Include <iostream> <br/> # include <list> <br/> # include <boost/lambda/Lambda. HPP> <br/> # include <boost/lambda/bind. HPP> <br/> # include <boost/assign. HPP> </P> <p> using namespace STD; <br/> using namespace boost; <br/> using namespace Lambda; <br/> using namespace assign; </P> <p> # include "utility. H "</P> <p> template <typename T, typename actionfunc, typename u> <br/> T cfold2 (actionfunc F, t Z, const list <u> & L) <br/> {<br/> If (L. empty () return Z; <br/> u x = L. front (); <br/> List <u> Xs (++ L. begin (), L. end (); <br/> return f (x, z, BIND (static_cast <t (*) (actionfunc, T, const list <u> &)> (& cfold2), VAR (F), _ 1, VAR (XS); <br/>}</P> <p> template <typename T, typename opfunc, typename u> <br/> T cfold (opfunc op, t Z, const list <u> & L) <br/>{< br/> return cfold2 (BIND (OP, _ 1, BIND (_ 3, _ 2), Z, L); <br/>}</P> <p> int main () <br/>{< br/> List <int> L; <br/> L + = 1, 2, 4; <br/> cout <cfold (plus <int> (), 0, L) <Endl; <br/> cout <cfold2 (BIND (cons_op, _ 1, BIND (_ 3, _ 2), list <int> (), L) <Endl; <br/> cout <cfold2 (BIND (_ 3, BIND (cons_op, _ 1, _ 2), list <int> (), L) <Endl; <br/> return 0; <br/>}</P> <p> // 10 <br/> // [,] <br/> // [,]C ++ Code 2 # Include <array> <br/> # include <functional> <br/> # include <algorithm> <br/> # include <boost/assign. HPP> <br/> # include <iostream> </P> <p> using namespace STD; <br/> using namespace boost: Assign; </P> <p> # include "utility. H "</P> <p> template <typename T, typename actionfunc, typename u> <br/> T cfold2 (actionfunc F, t Z, const list <u> & L) <br/> {<br/> If (L. empty () <br/> return Z; <br/> u x = L. front (); <br/> List <u> Xs (++ L. begin (), L. end (); <br/> return f (x, z, [&] (t y) {return cfold2 (F, Y, XS );}); <br/>}</P> <p> template <typename T, typename opfunc, typename u> <br/> T cfold (opfunc op, t Z, const list <u> & L) <br/> {<br/> return cfold2 ([&] (u x, t, function <T (t)> G) {return OP (x, g (t) ;}, Z, L); <br/>}</P> <p> int main () <br/>{< br/> List <int> L = list_of (1) (2) (3) (4 ); <br/> cout <cfold (plus <int> (), 0, L) <Endl; <br/> cout <cfold2 ([] (int x, list <int> T, function <list <int> (list <int>)> G) {return cons_op (x, g (t ));}, list <int> (), L) <Endl; <br/> cout <cfold2 ([] (int x, list <int> T, function <list <int> (list <int>)> G) {return g (cons_op (x, t) ;}, list <int> (), L) <Endl; <br/> return 0; <br/>}</P> <p> // 10 <br/> // [1, 2, 3, 4] <br/> // [4, 3, 2, 1]