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  }