1

隐性编程的一个想法是,如果可以避免的话,不要将参数应用于函数。

如果函数是一等成员,为什么 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

我得到编译错误...

未找到与此覆盖对应的抽象属性

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

4

1 回答 1

2

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

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

但是接口一般都是bleh。它们只适用于传递泛型函数而不会失去泛型。当函数是非泛型时,接口是严格劣等的。

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

type Adder = { Add: int -> int -> int }
let adder() = { Add = fun x y -> x + y }
let adderWithInnerAdder adder = { Add = adder.Add }
于 2017-03-03T05:20:26.080 回答