一段PHP版本的lambda实现

还有些缺陷,但能实现Church的自然数的lambda定义


class lambda
{
    private $f;
    private $args;
    private $count;
    public function __construct($f, $args = [])
    {
        if ($f instanceof lambda) {
            $this->f = $f->f;
            $this->count = $f->count;
            $this->args = array_merge($f->args, $args);
        }
        else {
            $this->f = $f;
            $this->count = count((new ReflectionFunction($f))->getParameters());
            $this->args = $args;
        }
    }

    public function __invoke()
    {
        if (count($this->args) + func_num_args() < $this->count) {
            return new lambda($this, func_get_args());
        }
        else {
            $args = array_merge($this->args, func_get_args());
            $r = call_user_func_array($this->f, array_splice($args, 0, $this->count));
            return is_callable($r) ? call_user_func(new lambda($r, $args)) : $r;
        }
    }
}

function lambda($f)
{
    return new lambda($f);
}

$int1 = lambda(function($f, $x) {
    return $f($x);
});

$successor = lambda(function($p, $f, $x) {
    return $f($p($f, $x));
});

$add = lambda(function($p, $q, $f, $x) {
    return $p($f, $q($f, $x));
});

$mul = lambda(function($p, $q, $x) {
    return $p($q($x));
});

$exp = lambda(function($m, $n) {
    return $n($m);
});

$int2 = $successor($int1);
$int3 = $add($int1, $int2);
$int4 = $mul($int2, $int2);
$int5 = $add($int2, $int3);
$int6 = $mul($int3, $int2);
$int7 = $add($int3, $int4);
$int8 = $exp($int2, $int3);
$int9 = $exp($int3, $int2);

function p($num)
{
    echo $num(function ($v){
        return $v + 1;
    }, 0). "\n";
}

p($int1);
p($int2);
p($int3);
p($int4);
p($int5);
p($int6);
p($int7);
p($int8);
p($int9);



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。