Реализовать интерфейс F# через неявное программирование

Идея неявного программирования состоит в том, чтобы не применять аргументы к функциям, если этого можно избежать.

Почему 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 и должно быть приемлемым.

1 ответ

Решение

Вы не можете назначить элементы интерфейса, как если бы они были функциями. Интерфейсы не работают так. Вы должны указать параметры:

    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 }
Другие вопросы по тегам