我想实现一个可以接受 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 的调用中的第一个参数修复为您想要的任何默认值。