我希望实现一个 F# 函数,它可以接受 1 或 2 个参数。我想这样使用函数:
let foo = ...
foo "a"
foo "a" "b"
这两个参数可以是相同类型。 我阅读了关于匹配模式,活动模式的页面,但没有找到适合我的。
我希望实现一个 F# 函数,它可以接受 1 或 2 个参数。我想这样使用函数:
let foo = ...
foo "a"
foo "a" "b"
这两个参数可以是相同类型。 我阅读了关于匹配模式,活动模式的页面,但没有找到适合我的。
我认为这是由于一些底层的.Net特性,但我认为你必须使用具有重载方法的类 - 类似于
type t() =
static member foo a = "one arg"
static member foo (a,b) = "two args"
foo"a"
会存在歧义,无法确定是调用第一种重载还是将第二种重载柯里化。 - Guvante在类型成员上,您可以使用可选参数:
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" }
除了其他答案之外,您还可以通过部分应用和柯里化来实现所需的功能。像这样:
let foo a b =
a + b
let foo2 a =
foo 1 a;;
list
。如果其中一个是可选的(例如可能有默认值可以省略),请将其设置为可选:foo(a, ?b)
。如果您的数据可以用这种方式表示,也可以考虑使用 DU。否则,我会只使用两个函数。 - Be Brave Be Like Ukraine