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

しかし、インターフェースは一般的にブレです。それらは、ジェネリック性を失わずにジェネリック関数を渡すのにのみ適しています。関数が非ジェネリックである場合、インターフェイスは完全に劣っています。

代わりに、より機能的なアプローチを採用したい場合は、人生はすぐに楽になります。

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 に答える