Есть ли причина, по которой разработчики рабочих процессов в F # не используют интерфейсы?

#f# #monads

#f# #монады

Вопрос:

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

Комментарии:

1. Мое лучшее предположение заключается в том, что вам не нужно реализовывать все это, если вы этого не хотите?

Ответ №1:

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

Ответ №2:

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

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

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

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

Комментарии:

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