github.com/packtpublishing/learning-functional-programming-in-go@v0.0.0-20230130084745-8b849f6d58c4/Chapter09/misc/ex3/lambda.go (about) 1 package main 2 3 import "fmt" 4 5 // Inline definition 6 func main() { 7 // No inline definition 8 fmt.Println(compose(mul3, add1)(10)) 9 10 // fmt.Println(compose(mul3, func(n int) int { return n + 1 })(10)) 11 // fmt.Println(compose(func(n int) int { return n * 3 }, func(n int) int { return n + 1 })(10)) 12 13 // Replace add1 by its definition 14 fmt.Println(compose(mul3, func(x int) fii { return func(v int) int { return func(n int) int { return n + x }(v) } }(1))(10)) 15 16 // Replace mul3 by its definition 17 fmt.Println(compose(func(n int) int { return func(z int) int { return n * 3 }(1234567) }, func(x int) fii { return func(v int) int { return func(n int) int { return n + x }(v) } }(1))(10)) 18 19 // Replace compose by its definition 20 fmt.Println(func(f, g fii) fii { return func(n int) int { return f(g(n)) } }(func(n int) int { return func(z int) int { return n * 3 }(1234567) }, func(x int) fii { return func(v int) int { return func(n int) int { return n + x }(v) } }(1))(10)) 21 22 // Pure lambda expression 23 // - no assignments 24 } 25 26 type fii func(int) int 27 28 func compose(f, g fii) fii { 29 return func(n int) int { return f(g(n)) } 30 } 31 32 var add1 = makeAdder(1) 33 34 func mul3(n int) int { 35 return func(z int) int { return n * 3 }(1234567) 36 } 37 38 func makeAdder(x int) fii { 39 return func(v int) int { return func(n int) int { return n + x }(v) } 40 }