分配的匿名函数与命名函数声明

时间:2014-09-30 06:04:54

标签: function functional-programming lambda lambda-calculus

在开发函数式编程语言时,是否可以使指定的匿名函数表达式等效于命名函数声明/定义?

例如,在这种伪语言中:

add = \ x y -> x + y -- assigned anonymous function expression
add x y = x + y -- named function declaration

我知道在非功能语言中,2有一些不同的属性,但我问为什么它们不能相同?这是编译器问题吗?

例如,是否有语言在递归方面使上述2等效?所以我可以使用他们的名字和指定的标签进行递归?

factorial = \ n -> if n = 0 then 1 else n * factorial (n-1)
factorial n = if n = 0 then 1 else n * factorial (n-1)

另见:http://www.haskell.org/haskellwiki/Declaration_vs._expression_style

2 个答案:

答案 0 :(得分:1)

  

在开发函数式编程语言时,是否可以使指定的匿名函数表达式等效于命名函数声明/定义?

是的,假设您的语言支持命名的lambda函数或用于在lambda函数内递归的构造。

  

我知道在非功能语言中,2有一些不同的属性,但我问为什么它们不能相同?这是编译器问题吗?

这取决于你所说的语言。

  

例如,是否有语言在递归方面使上述2等效?所以我可以使用他们的名字和指定的标签进行递归?

在递归方面,匿名函数和命名函数之间存在差异。许多函数式语言通过一个特殊的结构来解决这个问题,它允许你在自己​​的范围内命名匿名函数,以便它们能够自己调用。

例如,在Clojure中,您可以像在此表达式中一样命名lambda函数:

(fn power [n e]
   (if (zero? e)
     1
     (* n (power n (dec e)))))

或在JavaScript中:

function power(n, e) {
  if (e === 0) {
    return 1;
  } else {
    return n * power(n, e - 1);
  }
}

此处,符号power绑定在power函数的环境中,但不在外部。这与在当前环境中定义函数不同 - 从而使符号power对其他人可见:

(defn power [n e]
   (if (zero? e)
     1
     (* n (power n (dec e)))))

或在JavaScript中:

var power = function (n, e) ...

但它们都是等效的函数,数学上。

答案 1 :(得分:0)

我倾向于你的问题,因为它包含非一般(私人?)术语和自我思考的想法,好像每个人都会像你一样思考。

例如:

  

是否有语言可以使上述2等效   递归条款?所以我可以使用他们的名字和他们的名字   分配标签?

为什么“使它们等效”,当完全有可能在某些语言中它们已经 (语义上,但不是语法上)等效?所以更好的问题是:它们在哪些语言中是等价的?他们不是在其他语言中有什么区别?

接下来,什么是“指定标签”?我想这是你的私人术语,你知道它是如何工作的,你假设我们都分享这些想法。

让我告诉你,例如,在Haskell中,我们不“指定标签”。我们宁愿将名称绑定到值。而这是我们以参考透明的方式做的。这基本上意味着:无论是编写名称还是绑定的表达式都无关紧要。