====== Lambda Calculus ====== ==== Point-Free Style: compose-compose pattern ==== ''(◦ f) ◦ g '' is equivalent to ''λxy. g(x, f(y))''. In &HS Haskell: -- let h = (. f) . g, then -- h x = ((. f) . g) x -- = (. f) (g x) -- = (g x) . f -- then -- h x y = ((g x) . f) y -- = g x (f y) ((. (+3)) . (\x y -> x^2 + y^2)) 1 2 -- yields 26 In &MMA Mathematica: Composition[ CurryApplied[Composition, {2, 1}][CurryApplied[f, 1]], CurryApplied[g, 2] ][x][y] (* yields g[x, f[y]] *) Composition[ CurryApplied[Composition, {2, 1}][CurryApplied[Plus, 2][3]], CurryApplied[#1^2 + #2^2 &, 2] ][1][2] (* yields 26 *) In &RKT Racket: #lang racket (define (comp-comp f g) (let [[cf (curry f)] [cg (curry g)]] (compose (lambda (x) (compose x cf)) cg))) (define (f x) (+ x 3)) (define (g x y) (+ (* x x) (* y y))) (((comp-comp f g) 1) 2) ;; yields 1^2 + (2+3)^2 = 26 There's a package called ''relation-lib'', the function ''uncurry'' in it makes things simpler: #lang racket (require relation/function) (define (comp-comp f g) (let [[cf (curry f)] [cg (curry g)]] (uncurry (compose (lambda (x) (compose x cf)) cg)))) (define (f x) (+ x 3)) (define (g x y) (+ (* x x) (* y y))) ((comp-comp f g) 1 2) ;; yields 1^2 + (2+3)^2 = 26