帮助函数的命名约定是什么?

时间:2009-01-06 20:55:44

标签: haskell functional-programming naming-conventions helper-functions

在函数式编程中,将任何“循环”代码优化为尾递归通常很重要。尾递归算法通常在两个函数之间分配,但是 - 一个用于设置基本情况,另一个用于实现实际循环。一个好的(尽管是学术的)例子是反向函数。

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”只是尴尬。

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

7 个答案:

答案 0 :(得分:22)

您可以随意调用辅助函数,只要不将辅助函数放在“全局”命名空间中就没关系。简单地添加“素数”似乎是一种常见的做法。 :)例如,在Haskell中,

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

答案 1 :(得分:6)

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

答案 2 :(得分: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是默认实现(可能是最常用的函数)。

答案 3 :(得分:3)

我倾向于在最后添加“_recurse”。所以“reverse_recurse”。不知道我从哪里得到的。我喜欢像你的例子中那样简单地保留基本案例功能。它往往是“公共”函数,并且它使用辅助函数来执行迭代这一事实与调用者无关。在javascript中,我有时会通过闭包来隐藏迭代函数,以使其非常清楚它不会被直接调用。

答案 4 :(得分:3)

我也同意ShreevatsaR,在这个例子中,我会帮助私人函数。

对于其他需要帮助函数在整个模块中可见但未导出的情况,我倾向于在函数前加上'_'。当然,有明确的出口声明,但在开发过程中我倾向于导出所有功能以简化交互式探索,例如在ghci。稍后我会添加导出函数列表,并且下栏可以很容易地记住我是否打算将函数设置为本地函数。

答案 5 :(得分:2)

我使用auxfoo_aux(对于主要功能foo),并嵌套定义,使其不在外部可见。

答案 6 :(得分:1)

设置并执行

示例:

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