如何在F#中实现变量参数

时间:2012-04-26 05:26:26

标签: f#

我想实现一个可以接受1或2个参数的F#函数。我想使用这样的函数:

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

两个参数都可以是相同的类型。我阅读了有关匹配模式活动模式的网页,但找不到适合我的网页。

4 个答案:

答案 0 :(得分:7)

我认为这是由于一些基本的.Net功能,但我认为你必须使用一个带有重载方法的类 - 比如

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

答案 1 :(得分:5)

在类型成员上,您可以使用可选参数:

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

要调用此方法:

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

这就是你要追求的吗?

不幸的是,你不能在函数上使用可选参数。

答案 2 :(得分: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也是可选的,这不是你想要的。虽然很有用。

答案 3 :(得分:2)

除了其他答案之外,您还可以通过部分应用和currying来做你想做的事。像这样:

let foo a b =
   a + b

let foo2 a =
   foo 1 a;;

显然你想要在foo2中调用foo中的第一个参数到你想要的任何默认值。