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中。稍後,我添加導出函數的列表,並使用下劃線可以輕鬆記住我是否希望函數是本地函數。

相關問題