2014-09-30 128 views
0

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

例如,在这个伪语言:

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

其中“非功能”语言是那些不同的,以及如何?用什么语言不能使用你的'factorial'定义? – molbdnilo 2014-09-30 06:28:37

+0

JavaScript,PHP,Python,Ruby,Haskell ......当然它们有像'function','def'等语法差异。等等。 – CMCDragonkai 2014-09-30 07:03:53

+1

@CMCDragonkai:在JavaScript,Python,Haskell中,2没有区别。在Ruby中,'def'定义了方法,所以实际上没有定义“命名函数”的语法。 – newacct 2014-09-30 18:43:55

回答

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) ... 

,但它们都是相同的功能,数学。

+0

我不确定我是否理解。但是在你的回答开始时,你说他们可以变得相当。但是在底部您已经确定了一个警告,即命名函数声明可以很容易地递归,但是如果没有使用固定的combinator,那么分配的匿名函数就不能使用。这并不意味着指定的函数声明不仅仅是指定匿名函数的语法糖,而且实际上是在做一些额外的事情(这允许简单的递归)? – CMCDragonkai 2014-09-30 09:53:17

+0

你能否详细阐述一下这个特殊的构造? – CMCDragonkai 2014-09-30 09:55:28

+0

@CMCDragonkai我会在我的答案中详细说明。 – 2014-09-30 09:58:00

0

我已经降低了您的问题,因为它包含非一般(私人?)术语和自我思考的想法,好像每个人都会像你一样思考。

例如:

是否有语言上作出上述2相当于递归的 方面?所以我可以递归使用他们的名字和 指定的标签?

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

接下来,什么是“分配标签”?我想这是你的私人术语,你有一些想法是如何工作的,并且你认为我们都分享这些想法。

让我告诉你,例如,在Haskell中,我们不会“分配标签”。我们宁愿将名称与价值绑定。我们以透明的方式进行。这基本上意味着:无论您是写出名称还是要绑定的表达式都无关紧要。

+0

谢谢你教我正确的术语。 – CMCDragonkai 2014-09-30 22:49:31