путаница в стране фантазий в подписи метода ap

В спецификации фэнтезийной страны сигнатура для метода определяется как

      fantasy-land/ap :: Apply f => f a ~> f (a -> b) -> f b

Это переводится как:container f with value aесть метод, который принимает параметрcontainer fсо значением функции(a ->b)и возвращаетcontainer f with value b. Надеюсь, я прав в этой интерпретации.

Если я проверю это с помощью Folktale, однако я увижу разные результаты:

      const Maybe = require("data.maybe")
Maybe.of(5).ap(Maybe.of(x => x + 1)) // Uncaught TypeError: f is not a function
Maybe.of(x=>x+1).ap(Maybe.of(5))     // Maybe { value: 6 }
Maybe.of(x=>x+1).ap(Either.of(5))    // Either { value: 6 }

Если я проверю это с помощью Sanctuary, я увижу аналогичные результаты (хотя в Sanctuary нет этого «метода»)

      const S = require("sanctuary")
let a = S.of(S.Maybe)(5)
let fn = S.of(S.Maybe)(x => x + 1)
S.ap(fn)(a) // Just (6)
S.ap(a)(fn) // Uncaught TypeError: Invalid value

Это подводит меня к выводу, что, возможно, фантастические спецификации дляapметод может быть:

      fantasy-land/ap :: Apply f => f (a -> b) ~> f a -> f b

Я новичок в FP и мире фэнтези. С удовольствием поправляюсь :)

1 ответ

Fantasyland указывает уровень взаимодействия, а не общедоступный API (хотя раньше это было так), поэтомуfantasy-land/префикс, который в противном случае был бы совершенно неудобным для пользователя. В результате вы можете найти разные соглашения в разных библиотеках. Часто библиотеки реализуют какfantasy-land/ap, с перевернутыми аргументами.

Спецификация для также изменилась в какой-то момент. В некоторых статьях до сих пор упоминается старая спецификация. Что касается реализации, они не хотят ломать своих пользователей, и старая спецификация, возможно, проще в использовании (вы можете связатьapзвонки).

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