質問

関数型プログラミングでは、多くの場合、「ループ」を最適化することが重要です。末尾再帰のコード。末尾再帰アルゴリズムは通常、2つの関数に分割されます-基本ケースを設定する関数と、実際のループを実装する関数です。 (学術的ではあるが)良い例は、逆関数です。

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"気まずいです。

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

役に立ちましたか?

解決

" _recurse"を追加する傾向があります最後まで。したがって、「reverse_recurse」。どこから入手したのかわかりません。あなたの例にあるように、基本ケース関数を単純なままにするのが好きです。 「パブリック」になる傾向があります。関数と、ヘルパー関数を使用して反復を実行するという事実は、呼び出し元とは無関係です。 javascriptでは、クロージャを介して反復関数を非表示にすることがあります。直接呼び出さないことを明確にするためです。

他のヒント

ヘルパー関数は好きなように呼び出すことができます。ヘルパー関数を" global"に入れない限り、問題はありません。名前空間。 「プライム」を追加するだけです。一般的な慣行のようです。 :)たとえば、Haskellで、

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

" do_compute"のように、常にdo_を使用します。 " compute"で。それは事実上、アクションを実行する関数の一部であるため、非常に記述的であることがわかりますが、「計算」は呼び出されるオブジェクトには、外の世界を表す簡単なわかりやすい名前が必要です。

ShreevatsaRに同意します。ヘルパー関数をトップレベルにしない(または、さらに悪いことに、エクスポートリストに追加する)場合、その名前は関係ありません。 ヘルパー関数 f および g を呼び出す傾向があります。

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

小さな関数に対してこの命名スキームを使用します(それ以外の場合、 f が何を指しているのかわかりません)。それからまた、なぜあなたは大きな関数を書くのでしょうか?

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

reverseAccumulator

Haskellの zip および zipWith と同様。 しかし、これらの「ヘルパー」関数を呼び出さず、 zipWith は単なる汎用関数であり、 zip はデフォルトの実装です(おそらく最もよく使用される実装です)。

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

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

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

セットアップと実行

例:

function whateverSetup() { ... }
function whateverExecute() { ... }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top