F# と overload

id:NyaRuRu:20080609:p2 の補足.F# で LINQ の Enumerable.Any 的なものを作ってみます.
引数の個数 (というより引数は 1 つで tuple の違いと見るべき?) によるオーバーロード.

#light

open System
open Seq

type MySeq =
    static member any<'a>(source:seq<'a>) = nonempty source
    static member any<'a>(source:seq<'a>, pred:'a->bool) = exists pred source

MySeq.any(seq {0 .. 10 }) |> print_any
MySeq.any(seq {0 .. 10 }, fun i -> i > 10) |> print_any
truefalse

optional arguments *1を使ってこうも書けます.

#light

open System
open Seq

type MySeq =
    static member any<'a>(source:seq<'a>, ?pred:'a->bool) =
        match pred with
        | None -> nonempty source
        | Some f -> exists f source

MySeq.any(seq {0 .. 10 }) |> print_any
MySeq.any(seq {0 .. 10 }, fun i -> i > 10) |> print_any
truefalse

*1:注:これは OCaml-style の optional arguments ではありません.