Ошибка с простой функцией Maybe

Фон

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

Код

Я использую Sanctuary, но это эквивалентно Ramda или любой другой библиотеке.

const S = require("sanctuary");

const transform = S.map(
  S.pipe( [ S.trim, S.toUpper ] )
);

S.Maybe.Just( ["  heello", "  world!"] )
  .map( transform )

Проблема

Проблема в том, что эта простая функция завершается с ошибкой:

TypeError: S.Maybe.Just(...).map не является функцией

Вопрос

Я в замешательстве, если не сказать больше. Я знаю, что Maybe — это монада, а монады — это функторы. У каждого функтора должен быть метод map, но почему-то Maybe.Just (который является типом Maybe) не имеет?

Что я делаю не так?


person Flame_Phoenix    schedule 30.07.2018    source источник


Ответы (1)


Maybe — это функтор, к которому присоединен fantasy-land/map, и он потребляется с помощью S.map. Кроме того, вы создаете Just, используя S.Just или S.of (S.Maybe):

const S = require("sanctuary");

const transform = S.pipe ([ S.trim, S.toUpper ])

const maybeTransformed = S.map (transform) (S.Just (['hello', ' world!']))
person Matías Fidemraizer    schedule 30.07.2018
comment
Вы также можете создать Just, используя S.Maybe.Just, который я использую. Спасибо! - person Flame_Phoenix; 30.07.2018
comment
@Flame_Phoenix Нет, S.Maybe.Just, похоже, предназначен для внутреннего использования Санктуария. Не используйте его: он не печатает проверку. - person Matías Fidemraizer; 30.07.2018
comment
Ааа, спасибо за наводку. Поскольку код работает как с S.Maybe.Just, так и с S.Just, я подумал, что смогу использовать и его. Оказывается, это не так! - person Flame_Phoenix; 30.07.2018