在Javascript中为任意整数生成Church编码的数字
我想要一个接受整数并以函数形式返回该数字的函数 我在newlisp中实现了这一点:在Javascript中为任意整数生成Church编码的数字,javascript,lambda-calculus,newlisp,Javascript,Lambda Calculus,Newlisp,我想要一个接受整数并以函数形式返回该数字的函数 我在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
(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)))
和(教堂编码3)将产生:
(lambda (f x) (f (f (f x))))
但是我想用Javascript做同样的事情。最好不要像我在这里所做的那样使用字符串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'));
(函数(){
功能范围(n){
var l=[];
对于(变量i=0;i
如果您在问题中包含您的newlisp代码,并简要描述其工作原理,那就太好了。您的问题是什么?你的JavaScript版本的代码有什么问题?@Bergi真的吗?“最好不要求助于字符串jank。”很明显,支持的javascript非常糟糕,肯定有比求助于eval更好的方法。这毕竟是lambda演算,所以都是手淫P@Squirrelsama当前位置在他发布代码之前我问过…
(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'));
(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)));
})();