たまには関数オーバーロードのない世界
いわゆる関数型言語では,関数オーバーロードを使う言語の方が珍しい気がしますが,それでも似たような処理をする関数を複数定義したくなったらどうするかというと,postfix を付けるのが一般的なのでしょうかね.例えば F#.
- Seq モジュールに定義された関数(値)たち - いげ太のブログ
- fold と fold1
- scan と scan1
- map と mapi, map2
- iter と iteri, iter2
i とか 1 とか 2 とか.
一方で,LINQ のこのネーミングセンスはまさに C++ 由来という感じ.
- Any の多重定義
// F# でいうところの nonempty public static bool Any<TSource>( this IEnumerable<TSource> source)
// F# でいうところの exists public static bool Any<TSource>( this IEnumerable<TSource> source, Func<TSource, bool> predicate )
- First の多重定義
// F# でいうところの hd public static TSource First<TSource>( this IEnumerable<TSource> source )
// F# でいうところの find public static TSource First<TSource>( this IEnumerable<TSource> source, Func<TSource, bool> predicate )
確かに Any, First それぞれで, predicate _=>true を省略したのが述語無し版というのは分からなくもないのですが,「典型的な引数の省略とみなせること」を理由に同じ名前を付けるのって,C++ 由来のノリなんですかねえ.関数型言語でこういう「アヒル感」は普通お目にかからない気がします. Haskell だとこういうスタイルは珍しくて,一方で Common Lisp や Mathematica ではそれほど珍しくないかもしれません.
コーディングスタイルというのは,実際には相性の良いスタイルの組で考えるべきで,その一部のみを切り出してもあんまり意味が無い気がします.良い名前付けなんて議論も,多重定義に関するルールと無関係ではないのですよね.
仮に関数オーバーロードを許していれば,Win32 API の名前もだいぶ違ったものになっていたでしょうね.