gpt4 book ai didi

inheritance - “base”值只能用于直接调用覆盖成员的基本实现

转载 作者:行者123 更新时间:2023-12-01 11:57:13 24 4
gpt4 key购买 nike

为什么我不能在这里调用 fbase 实现:

type Base = 
abstract f : int -> int -> int
default this.f (x : int) (y : int) : int = x + y

type Derived =
inherit Base
override this.f (x : int) (y : int) : int = base.f -x -y

调用 base.f 会引发此编译器错误:

error FS0419: 'base' values may only be used to make direct calls to the base implementations of overridden members

如果我将 f 更改为采用单个参数,那么它会编译。大概这与柯里化(Currying)参数与元组参数有关,但上面的代码对我来说看起来不错。

最佳答案

我认为问题是 base 不能被闭包捕获——必须直接调用。然而,覆盖柯里化(Currying)函数会自动创建一个闭包,因为只有第一个参数会立即应用。因此,即使看起来您确实在使用 base 值来直接调用被覆盖成员的基本实现,但您实际上是在使用 base 值在闭包中,这是非法的。

不幸的是,我认为没有什么好的方法可以解决这个问题。通常,您应该尽可能避免使用柯里化(Currying)成员,但这里有一个替代方案:

type Base = 
abstract f : int -> (int -> int)
default this.f (x : int) = fun y -> x + y

type Derived =
inherit Base
override this.f x =
let fn = base.f -x
fun y -> fn -y

关于inheritance - “base”值只能用于直接调用覆盖成员的基本实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5847202/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com