我调查了Erlang并且对变量的重新分配感到困惑,例如可以使用计数器:
环(值,计数器) - > IO:格式( “〜S,〜n的”,[值]), 环(值,的计数器-1 )。
我希望看到纯粹的功能性语言。 或者,我应该改变我的POV吗?
干杯,
托马斯
答案 0 :(得分:4)
Counter-1
是一个新值,未分配给任何现有变量。答案 1 :(得分:2)
loop(Value,Counter)-> io:format("~s,~n",[Value]), loop(Value,Counter-1).
在上面的函数定义中,函数名称本身出现在定义的右侧,并且与同一个arity一起使用。我们将这种类型的定义称为递归定义。每个递归调用将定义一个名为Counter
的值,该值仅在当前递归级别中可见。换句话说,对应于表达式Counter - 1
的评估的数字将绑定到 new Counter
变量,与表达式中使用的变量无关。
但是,这种类型的递归函数调用称为 tail-recursive 。它是一种特定类型的调用,具有可优化到实际循环的属性。最终结果是函数使用的Counter
的内存单元将使用新值更新并在递归调用中使用,而不是再次为新的Counter
值分配(1) )。这允许潜在的无限递归方案。
关于功能语言的概念,如果不首先对构成功能语言的内容进行适当的定义,以及纯粹的功能语言是什么,就很难回答。
在我的书中,函数式语言是一种基于lambda演算概念的语言:函数抽象和应用程序,高阶函数:这也称为函数作为语言的一等公民。 Erlang绝对适合这种模式。纯FL可能是不支持其他主要编程范式的,即命令式(变量可变性)。 再次Erlang匹配那个定义。如果你有不同的定义,那么Erlang的情况可能会有所不同。
请注意使用Process Dictionary:
破坏参照透明度
使调试变得困难
Survives Catch / Throw
(强调我的)。
因此,Erlang并非严格纯粹。
(1)尾递归不是实现优化的唯一方法:参见http://learnyousomeerlang.com/recursion