Отвечая на этот вопрос, я обнаружил следующее поведение compare
о дискриминируемых союзах.
type T = A | B | C | D
compare A B (* val it : int = -1 *)
compare A C (* val it : int = -2 *)
compare A D (* val it : int = -3 *)
Меня это удивило.
Могу ли я положиться на compare
измерение "расстояния" между конструкторами, подобными этому?
В спецификации говорится (стр. 154) о сгенерированном compareTo
:
Если T является типом объединения, вызовите Microsoft.FSharp.Core.Operators.compare сначала для индекса вариантов объединения для двух значений, а затем для каждой соответствующей пары полей x и y для данных, переносимых случаем объединения. Вернуть первый ненулевой результат.
Исходя из этого, я ожидаю, что compare
для типа T
всегда будет давать одно из -1,0,1
, поскольку именно так compare
ведет себя с числовыми типами. (Правильно?)
CompareTo(other)
как (this - other), например((short)2).CompareTo((short)5)
возвращает -3. - person Lee   schedule 15.03.2014compare
в F #. Например,2s.CompareTo(5s)
возвращает-3
, как вы говорите, ноcompare 2s 5s
возвращает только-1
. - person Tomas Petricek   schedule 15.03.2014