Я считаю, что проблема в том, что base
не может быть захвачено закрытием - вызов должен быть сделан напрямую.Однако переопределение каррируемой функции автоматически создает замыкание, так как только первый аргумент применяется немедленно.Следовательно, даже если кажется, что вы действительно используете значение base
для прямого вызова базовой реализации переопределенного члена, вы фактически используете значение base
в замыкании, что недопустимо.
К сожалению, я не думаю, что есть какой-то отличный способ обойти эту проблему.Как правило, вы должны избегать карри членов, когда это возможно, но вот одна альтернатива:
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