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) }
Go Go!!はGoogle様の協賛により開催されました
とid:ranhaさんが書けと仰られた。
http://atnd.org/events/2115 に、当日気付いて、その時は15/15でしたのであきらめて寝て、半分ぐらい時間が過ぎてから目が覚めて、なんだか17/18になっていたみたいですので参加させていただきました。ありがとうございます。
上記Yコンビネータはid:oskimuraさんと作りました。