一段PHP版本的lambda实现

WBOY
풀어 주다: 2016-06-23 13:46:16
원래의
1018명이 탐색했습니다.

还有些缺陷,但能实现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() 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);
로그인 후 복사



원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿