Вероятно, нет, по крайней мере, ни одним из обычных способов.
Монады в программировании обычно определяются по категории типов с функциями в виде стрелок.В этом случае метод, возвращающий this
, является стрелкой от класса к себе - это эндо морфизм с обычным моноидом композиции функций, но не является функтором .
Обратите внимание, что функторы с типами функций, безусловно, возможны, но функтор F(A) => (A -> A)
на самом деле не работает, потому что тип появляется как в ковариантном, так и в контравариантном положении, то есть, учитывая функцию A -> B
, вы можетеотправить A -> A
на A -> B
, или вы можете отправить B -> B
на A -> B
, но вы не можете получить B -> B
от A -> A
или наоборот.
Однако,есть один способ рассматривать экземпляры как имеющие монадическую структуру.Учтите, что методы экземпляра фактически имеют this
в качестве неявного аргумента.Таким образом, для некоторого класса C его методы являются функциями от C до любого другого типа.Это примерно соответствует ковариантной функции функтора выше.Обратите внимание, что я не описываю здесь какой-либо конкретный класс , а весь концепт классов и экземпляров!Итак, для этого отображения из C в методы экземпляра C:
Если у нас есть метод экземпляра, возвращающий некоторый тип A
, и функцию с типом A -> B
, мы можем тривиально определитьметод, возвращающий что-то типа B
: это остальная часть определения функтора, также называемая 'fmap` в Haskell.
Если у нас есть какое-то значение типа A
, мы можемдобавьте тривиальный метод экземпляра, который просто возвращает это значение: это «единичная» операция монады, иначе говоря, return
в Haskell.
Если у нас есть метод экземпляра, возвращающий значение типа A
, и другой метод экземпляра, принимающий аргумент типа A
и возвращающий значение типа B
, мыМожно определить метод, который просто возвращает значение типа B
, комбинируя их.Это монадное связывание, также называемое (>>=)
в Haskell.
Haskell вызывает монаду «функций, которые все принимают первый аргумент некоторого фиксированного типа» - Монаду Читателя и do
нотация для него позволяет вам писать код, в котором этот первый аргумент неявно доступен - скорее как способ, которым this
неявно доступен внутри методов экземпляра.
Различие здесь в том, что с экземплярами класса монадическая структураэто ... что-то вроде уровня синтаксиса , а не то, что вы можете использовать непосредственно в программе, по крайней мере, в большинстве языков.