2012-04-26 3 views
5

1つまたは2つの引数を受け入れることができるF#関数を実装したいと考えています。私はこのような関数を使いたいと思います:F#で可変引数を実装する方法

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

どちらの引数も同じ型にすることができます。 の一致パターンのアクティブパターンについてのページを読んでいますが、私の作品が見つかりません。

+0

答えが悪い習慣ですが、実際にはそれを必要としませんが、それは私の心に来ています。あなたの引数が同じ型の値のリストであれば、それらを 'list'にしてください。そのうちの1つが省略可能な場合(省略可能なデフォルト値を持つなど)、オプションにする: 'foo(a、?b)'。あなたのデータがこのように表現されていれば、DUを検討することもできます。それ以外の場合は、2つの関数を使用します。 – bytebuster

答えて

2

その他の回答に加えて、部分的なアプリケーションとカリングによって、必要なことを行うこともできます。このように:

let foo a b = 
    a + b 

let foo2 a = 
    foo 1 a;; 

明らかに、foo2内のfooの呼び出しで、最初のパラメータを任意のデフォルトに修正したいと思うでしょう。

7

私はこれが基本的なネット機能のいくつかが原因であると考えているが、私はあなたがオーバーロードされたメソッドを持つクラスを使用することがあると思う - 型のメンバで

type t() = 
    static member foo a = "one arg" 
    static member foo (a,b) = "two args" 
+5

2番目はタプルでなければならないことに注意してください。そうでないと、最初のオーバーロードを呼び出してから2番目のカリングを呼び出す間に 'foo" a "'が曖昧です。 – Guvante

5

のようなものを、あなたは、オプションのparamsを使用することができます:

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

が、これはあなたが後にしているものです:

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

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

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

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" } 

問題:あなたが望んだものではありませんこれは、また、任意です。しかし、役に立つことができます。

関連する問題