Батут как функтор

Я пытаюсь продемонстрировать Батут [+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)))

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

Другие вопросы по тегам