使用元组对抽象类型进行类型推断

FZe*_*Zed 2 f#

根据这个 kvb的答案,这段代码编译(F#4)并运行:

type Untupler = abstract Apply : 'u * 'u -> 'u

let myotherFun arg1 arg2 =
    printfn "myotherFun result is : %A %A" arg1 arg2

let myFunction tup1 tup2 (i:Untupler) =
    myotherFun (i.Apply tup1) (i.Apply tup2)

let reskvb = myFunction (1,2) ("Hello","World") { new Untupler with member __.Apply (x,y) = snd (x,y) }
Run Code Online (Sandbox Code Playgroud)

但如果最后一行被初始答案取代:

let reskvb = myFunction (1,2) ("Hello","World") { new Untupler with member __.Apply x = fst x }
Run Code Online (Sandbox Code Playgroud)

然后编译器抱怨错误FS0768: 成员'Apply'不接受正确数量的参数,预期有2个参数

我不明白为什么编译器似乎无法推断x确实是一个元组.还是我还缺少另一个问题?谢谢.

Mar*_*ann 5

这样做的原因是,当您开始使用接口时,您将转向F#对面向对象编程的支持,而在F#中,所有OOP互操作方法都默认为tupled.

因此,该Apply方法被解释为采用两个方法参数的方法,而不是将单个元组作为输入的函数.