Yコンビネータ書いてみました

package main

import "fmt"

type x_f func (a x_f) (func (a int) int)

func Y(f (func (a (func (a int) int)) (func (a int) int))) (func (a int) int) {
	return (
		func(proc x_f) (func (a int) int) {
			return f(
				func (arg int) int {
					return (proc(proc))(arg)
				}
			)
		}(
			func (proc x_f) (func (a int) int) {
				return f(
					func (arg int) int {
						return (proc(proc))(arg)
					}
				)
			}
		)
	)
}

func fact0 (f (func (a int) int)) (func (a int) int) {
	return (
		func (n int) int {
			fmt.Printf("* %d\n", n);
			if n == 0 {
				return 1
			}
			return n * f(n - 1)
		}
	)
}

func main() {
	var a int = (Y(fact0))(5);
	fmt.Printf("%d\n", a)
}