web-dev-qa-db-ja.com

高次関数の命名規則?

高次関数の命名規則はありますか?つまり、他の関数を返す関数です。

JavaScriptの例:

function onlyDivisibleBy(div) { // <-- higher order function
  return function (n) {
    return n % div === 0;
  }
}

var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

arr.filter(onlyDivisibleBy(3)); // [0, 3, 6, 9]
arr.filter(onlyDivisibleBy(5)); // [0, 5]

私は上記のようにそれを書く傾向がありました:つまり、呼び出しポイントで読みやすさを最適化します(上記の最後の行を「配列をフィルターして、5でのみ割り切れるアイテムを取得する」として読み取ります)が、定義ポイントでは離れていますこの関数が使用されているコンテキストから見ると、この関数がその名前から何をするかを理解するのはそれほど簡単ではありません。

15
nickf

いいえ、関数を返すことを示す特別な命名規則は必要ないと思います。関数が curried である言語からわかるように、関数を返すことは、基本的に複数の引数を持つ関数を持つことと同じです。例えばonlyDivisibleBy(3)(6)onlyDivisibleBy(3,6)にはほとんど違いがありません

名前をonlyDivisibleByからisDivisibleByに変更しますが、isは述語を示すためのより一般的な方法であり、onlyDivisibleBy(3)(6)が返すのは奇妙に思えますtrue 6も2で割り切れることを明らかに

14
jk.

強く型付けされた関数型言語では、関数シグネチャから何が高階関数で何がそうでないかは明らかなので、単に必要はありません。

他の言語では、そのような命名規則に出くわしたことはありませんし、面倒なだけの命名規則は考えられません。そのような名前をオーバーロードするよりも、関数のネーミングに集中する方が良いと思います。

5
itsbruce

いいえ、使用しないでください。

どうして?

ハンガリー語表記 のようなものだからです。高次関数に渡される関数は単なる変数の一種であるという考え方です。そのようにそれらを扱います。

4
Wilbert