我得到了这样的代码:
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)
答案 0 :(得分:3)
问题是instance.f
实际上不是一流的F#语法功能。它是一种标准的.NET方法调用,因此由于与互操作性相关的一些设计决策,它的行为方式并不完全相同。这些差异在存在方法特有的特征(但不是函数)时变得明显,例如重载和在这种情况下的可选参数。
如果将它包装成一个函数,它将按预期工作:
let callf (a, b) = instance.f (a, b)
let param = (1,"s")
let result2 = param |> callf
当然现在函数没有可选参数,可选参数解析是在函数定义中进行的。