RosettaCodeData/Task/Y-combinator/Go/y-combinator-1.go

42 lines
621 B
Go
Raw Permalink Normal View History

2013-04-11 01:07:29 -07:00
package main
import "fmt"
type Func func(int) int
type FuncFunc func(Func) Func
type RecursiveFunc func (RecursiveFunc) Func
func main() {
2015-02-20 00:35:01 -05:00
fac := Y(almost_fac)
fib := Y(almost_fib)
2013-04-11 01:07:29 -07:00
fmt.Println("fac(10) = ", fac(10))
fmt.Println("fib(10) = ", fib(10))
}
2015-02-20 00:35:01 -05:00
func Y(f FuncFunc) Func {
2013-04-11 01:07:29 -07:00
g := func(r RecursiveFunc) Func {
return f(func(x int) int {
return r(r)(x)
})
}
return g(g)
}
func almost_fac(f Func) Func {
return func(x int) int {
if x <= 1 {
return 1
}
return x * f(x-1)
}
}
func almost_fib(f Func) Func {
return func(x int) int {
if x <= 2 {
return 1
}
return f(x-1)+f(x-2)
}
}