Есть ли причина, по которой создатели рабочих процессов в F # не используют интерфейсы? - PullRequest
2 голосов
/ 26 апреля 2011

Это просто вопрос из любопытства: когда вы реализуете фабрику рабочих процессов, вы не делаете это как реализацию интерфейса, а просто проверяете, совпадают ли сигнатуры функций монадных функций.Есть ли для этого причина дизайна?

Ответы [ 2 ]

7 голосов
/ 26 апреля 2011

Во-первых, отсутствие высоконадежных типов в .NET означает, что вы не можете дать методам полезные подписи. Например, ListBuilder.Return должен иметь тип 't -> 't list, а OptionBuilder.Return должен иметь тип 't -> 't option. Нет способа создать интерфейс с методом Return, который имеет сигнатуру, поддерживающую оба этих метода.

5 голосов
/ 26 апреля 2011

Я думаю, что отсутствие вышеупомянутых типов, как упомянуто kvb, вероятно, является основной причиной.Есть способы обойти это, но это делает код немного неясным (см. этот фрагмент ).

Другая причина состоит в том, что выражения вычисления F # позволяют вам определять различные комбинации методов.Это не всегда просто Bind и Return.Например:

  • Некоторые определяют Yield, YieldFrom, Combine, чтобы разрешить генерацию результатов
  • Некоторые определяют Return, ReturnFrom, Bind, чтобы определитьМонада
  • Некоторые определяют Return, ReturnFrom, Bind, Combine, чтобы определить монаду, которая может возвращать несколько вещей
  • Некоторые также определяют Delay или Delayи Run для обработки лени

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

...