F # использовать композиционную нотацию в реализации интерфейса - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть следующий интерфейс:

type IFactory<'TIn, 'TOut> =
  abstract Create: 'TIn -> 'TOut

Я пытаюсь написать ComposedFactory. Следующий синтаксис выглядит как правильный синтаксис, поскольку VS не жалуется на это:

type ComposedFactory<'TIn, 'TMid, 'TOut>
  (midFactory: IFactory<'TIn, 'TMid>,
   outFactory: IFactory<'TMid, 'TOut>) =

    let Create' =
        midFactory.Create >> outFactory.Create

    interface IFactory<'TIn, 'TOut> with
        member __.Create x = Create' x

Но тот факт, что я определяю «Создать» дважды, кажется глупым. Я хочу интерфейс только один. Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Вы можете сделать это для спорта:

type ComposedFactory<'TIn, 'TMid, 'TOut>
   (midFactory: IFactory<'TIn, 'TMid>,
    outFactory: IFactory<'TMid, 'TOut>) =

interface IFactory<'TIn, 'TOut> with
    member __.Create x = (midFactory.Create >> outFactory.Create) x

Но я никак не могу назвать это предпочтительным по сравнению с тем, что у вас было раньше.

0 голосов
/ 18 ноября 2018

Я не могу понять, как делать то, что ты хочешь сделать, боюсь.Я бы предположил, что реализация интерфейсной функции явно требует, чтобы параметры были указаны в ее определении.

Лучшая альтернатива, которую я могу вам предложить, - это трубопровод:

member __.Create x = x |> midFactory.Create |> outFactory.Create
...