【问题标题】:Function returns value without replacing the variable with the given parameter函数返回值而不用给定参数替换变量
【发布时间】:2012-09-13 18:33:21
【问题描述】:

对我提出问题的愚蠢方式感到抱歉,这里有一些解释:我正在用 javascript 中的 lambda-calculus 进行试验,但遇到了一些小困难。 (你不需要知道任何关于 lambda 演算的知识来帮助我)

我有这个功能(教堂数字 1 顺便说一句):

function num1(c) {
return function(x){
    return c(x);
}
 }

alert(num1)

表现如预期,并给出与上面完全相同的东西。

alert(num1(num1))

表现出乎意料并给予:

function (x) {
    return c(x);
}

为什么 javascript 不将 'c' 替换为函数 num1?但是

alert(num1(num1)(num1))

给予:

function (x) {
    return c(x);
}

并表明第一个 c 实际上已按预期被函数替换。 如果“c”没有被替换,那么就会发生这种情况:

(num1(num1)(num1))=

(function (x) {return c(x);}(num1=

c(function num1(c) {
    return function(x){
        return c(x);
    }
})

总而言之,代码正在做它应该做的事情,但它不会输出替换了“c”的函数。我能做些什么?稍后,我将使用更多功能,然后我将无法区分 num1(asd)num1(jkl),因为 'c' 不会被替换。

非常感谢您的帮助!

别人

【问题讨论】:

  • 看起来你正在努力掌握Y-combinatorial...
  • 我知道 Y-combinator 以及它是如何工作的(但不知道为什么;))并且我可以在纸上使用它。我还不知道我到底想用 js 做什么,但这个例子只是我实际问题的简化:S- 和 K-Combinator 表现出同样愚蠢的行为。
  • FAQ 将告诉您如何格式化问题中的代码。
  • 你的意思是记录函数显示“错误”的源代码吗?这是意料之中的——JavaScript 不会改变你的源代码。事实上,源代码并没有定义执行的行为方式。
  • @someonelse:或者,您可以使用调试器。在return c(x); 行上设置断点,执行num1(num1) 并评估c 以查看c 指的是num1

标签: javascript anonymous-function currying lambda-calculus


【解决方案1】:

你为什么不试试这个:

function num1(c) {
   function rv(x){
    return c(x);
  }
   rv.showBinding = function() {
     return c;
   }

   return rv;

}

然后:

alert(num1);
alert(num1(num1).showBinding());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 2018-04-22
    • 2018-12-26
    • 2016-02-02
    • 2020-12-23
    • 2019-07-20
    • 2014-07-23
    相关资源
    最近更新 更多