Реализовать интерфейс 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 }