通过默认编程实现F#接口

Implement F# interface via tacit programming

tacit programming 的一个想法是,如果可以避免,则不要将参数应用于函数。

如果函数是第一个 class 成员,为什么 F# 不允许编译它?

type IAdder =
    interface
    abstract member Add : int -> int -> int
end

type Adder =
    interface IAdder with
        member this.Add x y = x + y

type AdderWithInnerAdder(adder:IAdder) =
    interface IAdder with
        member this.Add = adder.Add

我收到编译错误...

No abstract property was found that corresponds to this override

我觉得这应该编译。 adder.Add 明确实现了 IAdder.Add 并且应该可以接受。

您不能像分配函数一样分配接口成员。接口不是那样工作的。您必须指定参数:

    member this.Add x y = adder.Add x y

但界面通常很糟糕。它们仅适用于在不失去通用性的情况下传递通用函数。当函数是非泛型时,接口是严格劣等的。

如果您愿意采用更实用的方法,生活会很快变得轻松:

type Adder = { Add: int -> int -> int }
let adder() = { Add = fun x y -> x + y }
let adderWithInnerAdder adder = { Add = adder.Add }