3

baseここの実装を呼び出せないのはなぜですかf:

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単一の引数を取るように変更すると、コンパイルされます。おそらくこれは、カリー化されたパラメーターとタプルされたパラメーターに関係していますが、上記のコードは私には問題ないようです。

4

3 に答える 3

5

問題はbase、クロージャーによってキャプチャできないことだと思います-呼び出しは直接行う必要があります。ただし、カリー化された関数をオーバーライドすると、最初の引数のみがすぐに適用されるため、クロージャーが自動的に作成されます。baseしたがって、オーバーライドされたメンバーの基本実装を直接呼び出すために実際に値を使用しているように見えても、実際baseにはクロージャー内で値を使用しているため、これは違法です。

残念ながら、この問題を回避する優れた方法はないと思います。一般に、可能な場合はカリー化されたメンバーを避ける必要がありますが、1 つの代替手段を次に示します。

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
于 2011-05-01T18:15:29.377 に答える
0

カリー化されたパラメーターに関するあなたの仮定は正しいです。以下のコードはコンパイルされ、正常に実行されます。

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)

注: タプル パラメーターを使用しました。この理由は、カリー化されたパラメーターでは、関数が複数の関数に分割されるためである可能性があります (各関数は 1 つのパラメーターを受け取ります)。

于 2011-05-01T10:22:08.437 に答える