5

1 つまたは 2 つの引数を受け入れる F# 関数を実装したいと考えています。次のような関数を使用したいと思います。

let foo = ...
foo "a"
foo "a" "b"

両方の引数を同じ型にすることができます。match patternactive patternに関するページを読みましたが、自分に合ったものが見つかりません。

4

4 に答える 4

7

これは、基盤となる .Net 機能の一部によるものだと思いますが、オーバーロードされたメソッドを持つクラスを使用する必要があると思います-次のようなもの

 type t() =
     static member foo a = "one arg"
     static member foo (a,b) = "two args"
于 2012-04-26T05:40:36.813 に答える
5

型メンバーでは、オプションのパラメーターを使用できます。

type Helper private () =
    static member foo (input1, ?input2) =
          let input2 = defaultArg input2 "b"
          input1, input2

このメソッドを呼び出すには:

Helper.foo("a")
Helper.foo("a", "b")

これはあなたが求めているものですか?

残念ながら、関数でオプションのパラメーターを使用することはできません。

于 2012-04-26T07:46:13.897 に答える
3

他の回答に加えて、さらにいくつかの「ほぼ解決策」があります。それらは厳密にはあなたが望んでいたものではありませんが、とにかく知っておく価値があります.

リスト (または配列) とパターン マッチングの使用:

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 もオプションですが、これはあなたが望んでいたものではありません。しかし、役に立つことができます。

于 2012-04-28T22:11:53.190 に答える
2

他の回答に加えて、部分適用とカリー化によって、やりたいことができるかもしれません。このような:

let foo a b =
   a + b

let foo2 a =
   foo 1 a;;

明らかに、foo2 内の foo への呼び出しの最初のパラメーターを、必要なデフォルトに修正する必要があります。

于 2012-04-26T12:18:12.660 に答える