通过默认编程实现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 }
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 }