В Caml оператор ==
проверяет физическое равенство между двумя значениями одного и того же типа. Его можно использовать, в частности, для сравнения функций таким образом.Тест на физическое равенство для функций в Caml
Надо, например
# print_string == print_string;;
- : bool = true
, но, как ни удивительно,
# (==) == (==);;
- : bool = false
Это выражение должно быть оценено в true
.
Можете ли вы объяснить это поведение?
'(==)' не существует как замыкание, готовое быть, скажем, переданным функции высокого порядка. Его приложения создаются непосредственно в форме. Закрытие выделяется каждый раз, когда нужно, и два таких закрытия выделяются при разных адресах при записи '(==) == (==)'. Если вам нужны аналогичные свойства 'print_string', с текущими реализациями OCaml, дайте имя одному закрытию, которое вы заставите себя использовать везде:' let phys_equal x y = x == y ;; '. Это также может быть более эффективным с точки зрения памяти, чем распределение замыканий для unapplied '(==)' каждый раз. –