在开发函数式编程语言时,是否可以使指定的匿名函数表达式等效于命名函数声明/定义?
例如,在这种伪语言中:
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
答案 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中,我们不“指定标签”。我们宁愿将名称绑定到值。而这是我们以参考透明的方式做的。这基本上意味着:无论是编写名称还是绑定的表达式都无关紧要。