1 つまたは 2 つの引数を受け入れる F# 関数を実装したいと考えています。次のような関数を使用したいと思います。
let foo = ...
foo "a"
foo "a" "b"
両方の引数を同じ型にすることができます。match pattern、active patternに関するページを読みましたが、自分に合ったものが見つかりません。
1 つまたは 2 つの引数を受け入れる F# 関数を実装したいと考えています。次のような関数を使用したいと思います。
let foo = ...
foo "a"
foo "a" "b"
両方の引数を同じ型にすることができます。match pattern、active patternに関するページを読みましたが、自分に合ったものが見つかりません。
これは、基盤となる .Net 機能の一部によるものだと思いますが、オーバーロードされたメソッドを持つクラスを使用する必要があると思います-次のようなもの
type t() =
static member foo a = "one arg"
static member foo (a,b) = "two args"
型メンバーでは、オプションのパラメーターを使用できます。
type Helper private () =
static member foo (input1, ?input2) =
let input2 = defaultArg input2 "b"
input1, input2
このメソッドを呼び出すには:
Helper.foo("a")
Helper.foo("a", "b")
これはあなたが求めているものですか?
残念ながら、関数でオプションのパラメーターを使用することはできません。
他の回答に加えて、さらにいくつかの「ほぼ解決策」があります。それらは厳密にはあなたが望んでいたものではありませんが、とにかく知っておく価値があります.
リスト (または配列) とパターン マッチングの使用:
let f = function
| [a, b] -> ...
| [a] -> ...
| [] -> failwith "too few arguments"
| _ -> failwith "too many arguments"
f ["a"]
f ["a" ; "b"]
問題: パラメーターに名前が付けられていません。関数のシグネチャから、パラメーターの数が明確ではありません。
レコードを使用してすべてのオプション パラメータを渡します。
type FParams = { a : string; b : string }
let fdefault = { a = "a" ; b = "b" }
let f (pars: FParams) = ...
f { fdefault with b = "c" }
問題: a もオプションですが、これはあなたが望んでいたものではありません。しかし、役に立つことができます。
他の回答に加えて、部分適用とカリー化によって、やりたいことができるかもしれません。このような:
let foo a b =
a + b
let foo2 a =
foo 1 a;;
明らかに、foo2 内の foo への呼び出しの最初のパラメーターを、必要なデフォルトに修正する必要があります。