Lambda演算中的JavaScript匿名函数模拟算法,结果返回`undefined`

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lambda演算中的JavaScript匿名函数模拟算法,结果返回`undefined`相关的知识,希望对你有一定的参考价值。

我打算使用javascript闭包来模拟lambda演算中的基本算术,以定义3 = 1 + 2像这样:

0 := λf.λx.x
1 := λf.λx.f x
2 := λf.λx.f (f x)
3 := λf.λx.f (f (f x))

它应该打印三遍hello world,现在它打印一次hello world和两次undefined。有人可以帮忙解释为什么会这样以及我的代码有什么问题吗?预先感谢。

var zero = function(f) {
  return function(x) {
    return x;
  };
};

var one = function(f) {
  return function(x) {
    return f(x);
  };
};

function add(n, m) {
  return function(f) {
    return function(x) {
      return n(f)(m(f)(x));
    };
  };
}

// test, define number two and number three in lambda calculus
var two = add(one, one);
var three = add(one, two);

// function f is to console.log
var print3times = three(value => console.log(value));
print3times("hello world")
// return:
// hello world
// undefined
// undefined
答案

关键是n(f)(m(f)(x))中的m(f)(x)返回undefined,因为它是console.log。然后,它首先运行它(并打印“ hello world”),但是在其上运行n(f)时,它将打印m(f)(x)的结果:未定义。如ASDFGerte所述,如果您添加“返回值”;对它。它将正常工作。

另一答案

您在这里。

var log = function(x) {
  console.log(x)
  return x
}

var zero = function(f) {
  return function(x) {
    return x;
  };
};

var one = function(f) {
  return function(x) {
    return f(x);
  };
};

function add(n, m) {
  return function(f) {
    return function(x) {
      return n(f)(m(f)(x));
    };
  };
}

// test, define number two and number three in lambda calculus
var two = add(one, one);
var three = add(one, two);

// function f is to console.log
var print3times = three(log);
print3times("hello world")

以上是关于Lambda演算中的JavaScript匿名函数模拟算法,结果返回`undefined`的主要内容,如果未能解决你的问题,请参考以下文章

自己理解Java中的lambda

匿名方法是怎样演变到Lambda表达试过程

Lambda

jdk1.8新特性总结

lamda表达式

代码世界中的Lambda