将管道元组转发到带有可选参数的方法

时间:2015-02-21 23:48:29

标签: f# optional-parameters

我得到了这样的代码:

type x() =
    member x.f(number:int, ?text:string) =
        "doesn't matter"

let instance = new x()
let result = instance.f(1, "s")

这很好用,但正如我正在进行的一些重构我发现,以下内容甚至无法编译。

let param = (1,"s")
let result2 = param |> instance.f

错误讯息为Type constraint mismatch. The type int * string is not compatible with type int The type 'int * string' is not compatible with the type 'int'

如果f()方法的两个参数都是非可选参数,则第二个示例正常工作。

在我的实际代码中,这个元组更大(5个值),并由一个单独的函数计算。我怎么处理这个?

(我将此示例在LinqPad上传到http://share.linqpad.net/cu92w2.linq

1 个答案:

答案 0 :(得分:3)

问题是instance.f实际上不是一流的F#语法功能。它是一种标准的.NET方法调用,因此由于与互操作性相关的一些设计决策,它的行为方式并不完全相同。这些差异在存在方法特有的特征(但不是函数)时变得明显,例如重载和在这种情况下的可选参数。

如果将它包装成一个函数,它将按预期工作:

let callf (a, b) = instance.f (a, b)
let param = (1,"s")
let result2 = param |> callf

当然现在函数没有可选参数,可选参数解析是在函数定义中进行的。