2014-12-03 2 views
-2

정수를 취하여 그 숫자를 church encoded 함수 형태로 반환하는 함수가 필요합니다.자바에서 임의의 정수에 교회 숫자를 생성하는 코드

나는 newlisp이를 달성 :

(define (reduce stencil sq) (apply stencil sq 2)) 
(define (num n) (cond 
    ((= n 0) 'x) 
    ((< n 2) '(f x)) 
    (true (reduce (fn (l i) (list 'f l)) (cons '(f x) (sequence 2 n)))))) 
(define (church-encode n) 
    (letex ((body (num n))) 
    (fn (f x) body))) 

내가 호출하면

(교회 인코딩 0) 내가 다시 교회로 인코딩 된 0의 람다 수 :

(lambda (f x) x) 

그리고 (church-를 인코딩 3)은 다음과 같이 나타납니다.

(lambda (f x) (f (f (f x)))) 

하지만 자바 스크립트에서 동일한 작업을 수행하려고합니다. 바람직하게는 내가 여기했던 같은 문자열 jank에 의존하지 않고 :

(function (_) { 
    var asnum = function(x) { return x((function(x) {return x+1;}), 0); }; 
    function church_encode(n) { 
     function genBody() { 
      return _.reduce(_.range(n), function(e,x) { 
       return e.replace("x", "f(x)"); 
      }, "x"); 
     } 
     eval("var crap = function (f, x) { return "+genBody()+"; }"); 
     return crap; 
    } 
    var encoded_nums = _.map(_.range(11), church_encode); 
    var numerics = _.map(encoded_nums, asnum); 
    console.log(numerics); 
})(require('lodash')); 
+0

당신이 어떻게 작동하는지에 대한 간략한 설명과 함께 질문 *에 newlisp 코드 *를 포함하는 경우 그것은 좋은 것입니다. –

+0

귀하의 질문은 무엇입니까? 자바 스크립트 버전의 코드에 어떤 문제가 있습니까? – Bergi

+0

@Bergi 정말요? "가급적이면 끈 팬티에 의지하지 말고." 소품 자바 스크립트가 끔찍하게 나쁘고 eval에 의존하는 것보다 더 나은 방법이 반드시 있어야한다고 분명합니다. 이것은 결국 람다 미적분입니다. 그래서 그것은 모두 자위입니다. : P – Squirrelsama

답변

1
(function() { 
    function range(n){ 
     var l = []; 
     for(var i = 0; i < n; i++){ 
      l.push(i); 
     } 
     return l; 
    } 
    function church_encode(n) { 
     if(n < 1) 
      return function(f, x) { return x; }; 
     if(n === 1) 
      return function(f, x) { return f(x); }; 

     function succ (n) { 
      return function(f,x) { 
       return n(f,f(x)); 
      } 
     } 
     return range(n).reduce(function(a){ 
      return succ(a); 
     }, function (f,x) { return x; }); 
    } 
    function to_int(f){ 
     var i = 0; 
     f(function(){ i++ }); 
     return i; 
    }; 
    console.log(to_int(church_encode(5))); 
})(); 
관련 문제