チャーチ数をつくってみた
SICP の問題2.6 を見ていたら書きたくなったので,別の言語で写経してみた.
#!/usr/bin/env perl # -*- mode: perl; coding: utf8; -*- use strict; use warnings; use Perl6::Say; my $zero = sub { my ($f) = @_; sub { my ($x) = @_; $x; }; }; sub add_1 { my ($n) = @_; sub { my ($f) = @_; sub { my ($x) = @_; $f->($n->($f)->($x)); }; }; } my $one = add_1($zero); my $two = add_1($one); sub plus ($$) { my ($m, $n) = @_; sub { my ($f) = @_; sub { my ($x) = @_; $m->($f)->($n->($f)->($x)); }; }; } sub display_church ($) { my ($n) = @_; my $inc = sub {$_[0] + 1}; $n->($inc)->(0); } say "zero = ", display_church($zero); say "one = ", display_church($one); say "two = ", display_church($two); say "(2 + 1) + 2 = ", display_church(plus(add_1($two), $two));
JavaScript は,return が必須だし,function キーワードは長いし.
こういうのを書くときは面倒.
あと括弧大杉.plus() んとことかわけわからん.
(function () { var zero = function (f) { return function (x) { return x; }; }; function add_1(n) { return function (f) { return function (x) { return f((n(f))(x)); }; }; }; var one = add_1(zero); var two = add_1(one); function plus(m, n) { return function (f) { return function (x) { return (m(f))((n(f))(x)); }; }; }; function display_church(n) { function inc(x) { return x + 1; }; return (n(inc))(0); }; alert("zero = " + display_church(zero)); alert("one = " + display_church(one)); alert("two = " + display_church(two)); alert("((2 + 1) + 2) = " + display_church(plus(add_1(two), two))); })();