高階関数の命名規則?[閉まっている]


15

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

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で割り切れる項目を取得する」と読みました)使用されているコンテキストから、この関数がその名前から何をするのかを理解するのはそれほど簡単ではありません。


4
それは驚くべきことでした。「高階関数」という用語は、別の関数を引数として受け入れる関数を意味すると常に理解していました。私はあなたが間違っていると言っているのではなく、私たちの理解の違いが面白いと思うだけです。
ラチェット

6
関数を返す@Racheet関数も高次です。彼らは両方をするかもしれません。
itsbruce

3
@Racheetは良い点であり、この例に非常に関連しています。OPが実際に実装しているのは部分的なアプリケーションです。関数が返される場所の多く(すべて?不明)は、代わりに部分的なアプリケーションとして表示できます。@ nickf: ここにあなたの例を実装するためのクリーンな方法だ

回答:


14

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

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


5

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

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


4

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

どうして?

それはハンガリー記法のようなものだからです。アイデアは、高階関数に渡される関数が単なる一種の変数であるということです。だからそのように扱う。


1
ハンガリー記法はどうしても避けなければならないという意味はありますか?間違ったコードを間違った
見た目に

4
私はそれを前に読んだことがあり、ハンガリーの表記法が悪いとまだ信じています:)
ウィルバート

@TehShrikeリンクが壊れています。
corvus_192

1
@ corvus_192は、Joelのブログの再設計で失われたに違いありません!新しいURLはjoelonsoftware.com/2005/05/11/making-wrong-code-look-wrongの
TehShrike
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.