путаница в стране фантазий в подписи метода 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
звонки).