10

関数型プログラミングでは、末尾再帰になるように「ループ」コードを最適化することが重要な場合がよくあります。ただし、末尾再帰アルゴリズムは通常、基本ケースを設定する関数と実際のループを実装する関数の 2 つの関数に分割されます。(アカデミックではありますが) 良い例は、reverse 関数です。

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」はぎこちないだけです。

このようなヘルパー関数にどの命名規則を使用しますか?

4

7 に答える 7

23

ヘルパー関数は好きなように呼び出すことができますが、ヘルパー関数を「グローバル」名前空間に配置しない限り、問題はありません。単純に「素数」を追加するのが一般的な方法のようです。:) たとえば、Haskell では、

reverse :: [a] -> [a]
reverse = reverse' []
    where reverse' :: [a] -> [a] -> [a]
          reverse' result [] = result
          reverse' result (x:xs) = reverse' (x:result) xs
于 2009-01-06T22:43:15.243 に答える
7

「do_compute」と「compute」のように、私は常に do_ を使用します。アクションを実行する関数の一部であるため、非常にわかりやすいと思いますが、呼び出される「計算」には、外の世界を簡単に説明する名前が必要です。

于 2009-01-06T22:34:39.347 に答える
7

ヘルパー関数をトップレベルにしない場合 (またはさらに悪いことに、エクスポート リストに入れる場合)、その名前が何であるかは問題ではないため、ShreevatsaR に同意します。私はヘルパー関数fg.

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

f私はこの命名スキームを小さな関数に使用しています (そうしないと、 が何を指しているのかわかりません)。繰り返しになりますが、なぜ大きな関数を作成するのでしょうか?

ただし、他の人にとって役立つ可能性があるために「ヘルパー」関数をエクスポートしたい場合は、次のように呼び出します。

reverseAccumulator

HaskellzipzipWith. しかし、私はこれらの「ヘルパー」関数とは呼びません。zipWith単なる汎用関数でzipあり、デフォルトの実装です (おそらく最も使用される関数です)。

于 2009-01-06T23:21:21.377 に答える
3

ShreevatsaRにも同意します。この例では、ヘルパーをプライベート関数にします。

モジュール全体にヘルパー関数を表示する必要があるが、エクスポートしない必要があるその他の場合は、関数の前に「_」を付ける傾向があります。確かに、明示的なエクスポートステートメントがありますが、開発中は、たとえばghciでのインタラクティブな探索を容易にするために、すべての関数をエクスポートする傾向があります。後で、エクスポートされた関数のリストを追加します。アンダーバーを使用すると、関数をローカルにするかどうかを簡単に思い出すことができます。

于 2009-01-07T09:19:39.453 に答える
3

最後に「_recurse」を追加する傾向があります。だから「reverse_recurse」。どこから入手したのかわからない。あなたの例のように、ベースケース関数をシンプルにしておくのが好きです。「パブリック」関数になる傾向があり、ヘルパー関数を使用して反復を実行するという事実は、呼び出し元には関係ありません。JavaScript では、クロージャを介して反復関数を隠し、直接呼び出されないことを明確にすることがあります。

于 2009-01-06T21:01:51.780 に答える
3

auxまたはfoo_aux(メイン関数の場合)を使用fooし、定義をネストして、外部から見えないようにします。

于 2009-01-07T01:31:28.507 に答える
1

設定して実行

例:

function whateverSetup() { ... }
function whateverExecute() { ... }
于 2009-01-06T20:59:50.490 に答える