たまには関数オーバーロードのない世界

いわゆる関数型言語では,関数オーバーロードを使う言語の方が珍しい気がしますが,それでも似たような処理をする関数を複数定義したくなったらどうするかというと,postfix を付けるのが一般的なのでしょうかね.例えば F#.

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 LispMathematica ではそれほど珍しくないかもしれません.
コーディングスタイルというのは,実際には相性の良いスタイルの組で考えるべきで,その一部のみを切り出してもあんまり意味が無い気がします.良い名前付けなんて議論も,多重定義に関するルールと無関係ではないのですよね.
仮に関数オーバーロードを許していれば,Win32 API の名前もだいぶ違ったものになっていたでしょうね.

修正履歴

  • 2008年6月9日
    • F# ならこれはあり得ない. → 関数型言語でこういう「アヒル感」は普通お目にかからない気がします.
  • 2008年6月13日
    • 関数型言語でも省略可能引数やオプション引数はそれほど珍しくない気がしてきたので,「関数型言語でこういう「アヒル感」は普通お目にかからない気がします」を削除してその後に追記.