我想实现一个可以接受1或2个参数的F#函数。我想使用这样的函数:
let foo = ...
foo "a"
foo "a" "b"
两个参数都可以是相同的类型。我阅读了有关匹配模式,活动模式的网页,但找不到适合我的网页。
答案 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中的第一个参数到你想要的任何默认值。