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 回答