Мне не совсем понятно из вопроса, действительно ли вы хотите , чтобы преобразования произошли или нет.
Операторы типа ==
и eq
действительно являются вызовами multi
sub
s с именами типа infix:<==>
, и есть много кандидатов. Например, есть один для (Int, Int)
, который выбирается, если мы сравниваем два Int
s. В этом случае он знает, что ему не нужно приводить, и просто выполнит целочисленное сравнение.
Операторы eqv
и ===
не приведут; первое, что они делают, это проверяют, что значения имеют один и тот же тип, и если они этого не делают, они go не более. Убедитесь, что вы используете правильный вариант в зависимости от того, хотите ли вы использовать семантику снимка (eqv
) или ссылочную семантику (===
). Обратите внимание, что типы действительно должны быть точными одинаковыми, поэтому 1e0 === 1
не получится истинным, поскольку одно значение равно Num
, а другое - Int
.
. Поведение с автоматическим приведением таких операторов, как ==
и eq
, может быть очень удобным, но с точки зрения производительности это также может быть ловушкой. Они принуждают, используют результат принуждения для сравнения, а затем выбрасывают его. Повторные сравнения могут, таким образом, многократно вызывать принуждения. Если у вас есть такая ситуация, имеет смысл разделить работу на две фазы: сначала «проанализировать» входящие данные на соответствующие типы данных, а затем go и выполнить сравнение.
Наконец, в При любом обсуждении эффективности стоит отметить, что оптимизатор времени выполнения хорош в удалении повторяющихся проверок типов. Таким образом, хотя в принципе, если вы читаете встроенный источник, ==
может показаться более дешевым в случае, если две вещи имеют одинаковый тип, потому что не требуется, чтобы они были точно одного типа, в действительности эта дополнительная проверка все равно будет оптимизирована для ===
.