Понимание 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)],

Надеюсь, это имеет смысл.

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