10

在函数式编程中,优化任何“循环”代码以进行尾递归通常很重要。尾递归算法通常分为两个函数,一个是设置基本情况,另一个是实现实际循环。一个好的(尽管是学术的)例子会是相反的功能。辅助函数的命名约定是什么?

reverse :: [a] -> [a] 
reverse = reverse_helper [] 

reverse_helper :: [a] -> [a] -> [a] 
reverse_helper result [] = result 
reverse_helper result (x:xs) = reverse_helper (x:result) xs 

“reverse_helper”不是一个很好的描述性名称。但是,“reverse_recursive_part”只是尴尬。

你会用什么命名约定来做这样的辅助函数?

+0

那是什么语言? – 2009-01-06 20:59:52

+0

对不起。我现在正在开发一个Haskell项目,这启发了这个问题。我可以给出一个Python/Java例子,尽管这样的辅助函数在命令式语言中没有那么有用。 – Cybis 2009-01-06 21:33:01

回答

3

我倾向于 “_recurse” 添加到末尾。所以“reverse_recurse”。不知道我从哪里得到。我喜欢让你的例子中的基本情况功能变得简单。它往往是“公共”功能,它使用辅助函数执行迭代的事实与调用者无关。在JavaScript中,我有时甚至会通过闭包来隐藏迭代函数,以使其清楚地表明它不会被直接调用。

1

设置和执行

例如:

function whateverSetup() { ... } 
function whateverExecute() { ... } 
+2

whateverSetup是一个可怕的名字,如果该函数是公开的。 – Cybis 2009-01-06 21:35:40

+0

@ [Cybis]:应暗示您用适当的描述性术语替换“whatever”,例如。 WidgetSetup,WidgetExecute等。 – 2009-03-17 13:57:37

5

我总是使用do_,像“计算”中的“do_compute”一样。我发现它很有描述性,因为它实际上是执行动作的函数的一部分,而被调用的“计算”需要为外部世界提供一个简单的描述性名称。

21

你可以调用任何你想要的帮助器函数,只要你不把辅助函数放在“全局”命名空间中就没有关系。简单地添加一个“主要”似乎是一种常见的做法。 :)例如,在Haskell,

reverse :: [a] -> [a] 
reverse = reverse' [] 
    where reverse' :: [a] -> [a] -> [a] 
      reverse' result [] = result 
      reverse' result (x:xs) = reverse' (x:result) xs 
5

我同意ShreevatsaR,如果你不把辅助功能的顶级(或者更糟,把它的出口列表),比什么都无所谓它的名字是。 我倾向于称助手功能fg

reverse :: [a] -> [a] 
reverse = f [] 
    where 
    f ys []  = xs 
    f ys (x:xs) = f (x:ys) xs 

我只是用了小的功能此命名方案(否则我不知道什么是f指)。那么,为什么你会写大功能呢?

但是,如果你想导出你的“帮手”的功能,因为它可能是有用的人,我把它叫做:

reverseAccumulator 

像Haskell的zipzipWith。 但我不会称这些'帮手'功能,zipWith只是一个通用功能,zip是默认实现(可能是最常用的功能)。

2

我使用auxfoo_aux(对于主函数foo),并嵌套定义,使其不可见。

3

我也同意ShreevatsaR,在这个例子中,我会让助手成为一个私有函数。

对于其他需要帮助函数在整个模块中可见但不导出的情况,我倾向于用'_'作为前缀。当然,有明确的出口声明,但在开发过程中,我倾向于导出所有函数以简化交互式探索,例如在ghci中。稍后,我添加导出函数的列表,并使用下划线可以轻松记住我是否希望函数是本地函数。

相关问题