Батут как функтор
Я пытаюсь продемонстрировать Батут [+A] как Функтор (т. Е. Предоставляет карту [B](f: A = >B)). Я понимаю классическую реализацию батута как монады, описанную в Stackless Scala.
Однако, есть ли способ реализовать функцию карты (а не flatMap) только с подклассами "Готово" и "Больше" в Trampoline, или мне нужно также добавить подкласс "Плоская карта"?
1 ответ
Вы не можете вызвать Батут представляет вычислительный процесс. Функтор дает вам map
функция, которая может только преобразовать ваше окончательное значение, но создать новое вычисление - это работа монад, которая каким-то образом абстрагируется от процесса вычисления, с flatMap
операция (хотя я определенно предпочитаю Haskell bind
имя, потому что это лучше обозначает фактическую семантику операции). Таким образом, с помощью функторов вы не можете связать разные части вычислений вместе, например, в скалазе Trampoline - это псевдоним для Free Monad, который определяет карту следующим образом:
def map[B](f: A => B): Free[S, B] =
flatMap(a => Return(f(a)))
Как вы можете видеть, он только трансформирует значение, но не присоединяет новый шаг, чего вы хотите достичь с помощью батутов.