Цель «функции идентификации»?

Я наткнулся на эту тему, когда читал документы PrototypeJS: это Функция идентификации. Я еще немного поискал и прочитал об этом, и я думаю, что понимаю его математическую основу (например, умножение на 1 является функцией тождества (или я неправильно это понял?)), но не почему вы написали бы JS( или PHP, или C, или что-то еще)-функция, которая в основном принимает X в качестве параметра, а затем просто делает что-то вроде return X.

Есть ли более глубокое понимание, связанное с этим? Почему Prototype предоставляет эту функцию? Для чего я могу его использовать?

Спасибо :)


person JorenB    schedule 19.08.2009    source источник


Ответы (2)


Использование функции Identity делает код библиотеки немного легче для чтения. Возьмем метод Enumerable#any:

  any: function(iterator, context) {
    iterator = iterator || Prototype.K;
    var result = false;
    this.each(function(value, index) {
      if (result = !!iterator.call(context, value, index))
        throw $break;
    });
    return result;
  },

Это позволяет вам проверить, является ли какой-либо из элементов массива истинным в логическом контексте. Вот так:

$A([true, false, true]).any() == true

но также позволяет обработать каждый из элементов перед проверкой на истинность:

$A([1,2,3,4]).any(function(e) { return e > 2; }) == true

Теперь без функции идентификации вам пришлось бы написать две версии любой функции, одну, если вы выполняете предварительную обработку, и одну, если вы этого не делаете.

  any_no_process: function(iterator, context) {
    var result = false;
    this.each(function(value, index) {
      if (value)
        throw $break;
    });
    return result;
  },

  any_process: function(iterator, context) {
    return this.map(iterator).any();
  },
person derfred    schedule 19.08.2009

Я не знаю об этой библиотеке, но обычно вы оптимизируете формулы, код или что-то еще, выделяя общую часть, например, if (add) (a + b) + x else a + b следует переписать в a + b + (add ? x : 0). Вы испытываете искушение сделать то же самое с

if (!initialized) initialize(callback_with_very_long_name) else callback_with_very_long_name

Выглядит очень похоже. Вы можете легко выделить общий фактор или термин, но как мы можем выделить приложение функции? Если вы понимаете математику или Hascel, вы должны увидеть, что

a ? x + v : v

очень похоже

a ? f value : value

Вы добавляете x в одном случае, но не добавляете в другом. Вы применяете функцию в одном случае, но не в другом. Вы оптимизируете первое в (a ? x : 0) + v, потому что 0 является аддитивным идентификатором (он ничего не меняет при добавлении к нему). ) и v здесь общий фактор, который приходит всегда, независимо от application of x. В случае применения функции (или не применения) общим фактором является обратный вызов. Мы хотим учесть это. Какую функцию тождества мы должны применить к нему, чтобы ничего не изменилось? Функция идентификации!

(a ? f : identity) value

это то, что мы ищем. Тогда наш исходный пример выглядит следующим образом

(initialized ? identity : initialize) (callback_with_very_long_name)

Обратите внимание, что теперь он помещается в одну строку страницы.

person Little Alien    schedule 05.06.2016