#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
orDelay
иRun
для обработки лени
… таким образом, выражения вычислений должны быть определены как довольно много разных интерфейсов. Я думаю, что текущий дизайн оставляет некоторую гибкость в том, какие функции вычислений вы можете поддерживать.
Комментарии:
1. Черт возьми, многое из этого действительно выше моего понимания! Да, я полагал, что им нужно будет создать тонну интерфейсов, но это не показалось достаточной причиной для, казалось бы, хакерского способа, позволяющего вам определять монады.