Функция %identity
является частью реализации, а не частью языка OCaml.Он сообщает компилятору (по сути), что ничего не нужно делать, чтобы изменить параметр функции на ее возвращаемое значение.Другими словами, он говорит компилятору продолжать использовать то же значение, но менять свое представление о типе.При неправильном использовании он в основном аннулирует все отличные гарантии безопасности системы типа OCaml.Также, конечно, не гарантируется работа в любых других реализациях языка (включая будущие выпуски компилятора INRIA).
Возможность встраивания компилятора OCaml уже должна гарантировать, что для идентичности не будет сгенерирован кодфункции.Поэтому я бы порекомендовал вам просто продолжать их использовать.
Обновление
Чтобы ответить на несвязанный вопрос в комментариях .... Предположим, у вас есть композиция функций и идентификаторfunction:
let (<<) f g x = f (g x)
let id x = x
Далее приведены функции для добавления элементов списка, умножения элементов списка и составления всех функций в списке:
# let sum l = List.fold_right (+) l 0;;
val sum : int list -> int = <fun>
# let product l = List.fold_right ( * ) l 1;;
val product : int list -> int = <fun>
# let composition l = List.fold_right (<<) l id;;
val composition : ('a -> 'a) list -> 'a -> 'a = <fun>
Примеры:
# sum [2; 3; 5; 7];;
- : int = 17
# product [2; 4; 17];;
- : int = 136
# let mx = composition [(+) 1; ( * ) 10];;
val mx : int -> int = <fun>
# mx 2;;
- : int = 21
Дело в том, что 0 является тождеством для сложения, 1 для умножения и id
для композиции функции.id
полезен все время, так же как 0 и 1.