Понимание Fantasyland `ap`
Я пытаюсь понять ap
, но возникли проблемы.
Джеймс Форбс в сказочной стране говорит:
Сначала мы учим функцию, как взаимодействовать с нашим типом, сохраняя эту функцию в контейнере, как любое другое значение. (Функции тоже значения, которые вы знаете!)
var square = Type.of(
a => a * a
)
//=> Type (number -> number)
Затем мы можем применить эту функцию к содержанию значения.
square.ap( Type.of(3) )
//=> Type(9)
ap
звонкиmap
на полученном типе, с самим собой в качестве функции преобразования.
function ap(type){
// recall our value
// is a function
// Type ( a -> a )
var transformer = this.__value
return type.map(transformer)
}
Так это выглядит ap
работает только если значение в нашем контейнере является функцией. Это уже кажется мне странным, потому что я думал, что весь смысл Perfect API заключается в том, что эти функции работают во всем каждый раз.
Я также хочу принять к сведению, чем из-за линии square.ap(Type.of(3) )
это выглядит как ap
принимает любой функтор (реализатор map
).
Теперь, если я перейду к спецификации javascript fantasy-land, которая, как я полагаю, основана на ссылке Джеймса Форбса, 1.i определение ap
подпись (a.ap(b)
) состояния
Если
b
не представляет функцию, поведениеap
не указано
Похоже, эта спецификация ожидает ap
взять функцию в отличие от The Perfect API.
В итоге, я думаю, я не понимаю спецификации для ap
или как это будет выглядеть. Когда я пытаюсь погуглить, кажется, что большинство людей просто хотят поговорить о map
что мне легко понять уже.
1 ответ
Спецификация FantasyLand предшествует статье Джеймса Форбса на три года и была создана Брайаном МакКенна, так что может показаться, что статья Джеймса Форбса основана на спецификации, а не наоборот.
Чтобы ответить на ваш вопрос, a
а также b
оба должны быть одного и того же вида "контейнера". Если a
может быть, тогда б тоже должно быть возможно. Если a
это задача, то b
также должно быть заданием.
Это указано здесь в спецификации FantasyLand:
b должен быть таким же, как Применить.
Кроме того, один из них должен содержать функцию в качестве своего внутреннего значения. Какая из них должна содержать функцию, зависит от API. В спецификации FantasyLand это b
это будет содержать функцию:
б должно быть применение функции
В статье Джеймса Форбса все наоборот. Я подозреваю, что это потому, что он основывает свою статью на Рамде, который принимает аргументы в порядке, противоположном тому, что вы обычно видите в JavaScript.
В любом случае, результат ap
значение с тем же типом контейнера, что и a
а также b
:
Apply, возвращаемый по ap, должен совпадать с a и b
и результат содержит результат применения содержащейся функции к другому содержащемуся значению.
Так что если a
были некоторые значения T[x] и b
были некоторые значения T[f], то a.ap(b)
было бы T[f(x)]
,
Надеюсь, это имеет смысл.