OCaml <
, >
, <=
, >=
операторы работают только с двумя значениями одного и того же типа, так что выражение "a" > true
является недействительным. Однако они работают для всех типов (с оговорками ниже). Вы можете найти определения этих операторов в модуле Pervasives
.
Порядок для этих операторов определяется только для простых значений (целые числа, символы, строки, байтовые последовательности и плавающие). В этих случаях в документации говорится, что они дают «обычный порядок».
Обычный порядок для строк и последовательностей байтов - лексикографический порядок. Для строк случай имеет значение.
Для составных значений заказ гарантированно будет соответствовать =
и будет согласованным.
Насколько я могу судить, заказ не определен для простых пользовательских типов, таких как type abc = A | B | C
. Я не ожидал, что это будет так, но это то, что я вижу в документации. На практике значения константных конструкторов, таких как A
, B
, C
, будут упорядочены в порядке декларации с первым наименьшим значением.
Я также не вижу определения порядка между false
и true
. Опять же, это удивительно. На практике false
составляет менее true
.
Следует отметить, что сравнение между циклическими значениями не гарантируется прекращением. Кроме того, сравнение значений, содержащих функции, может вызвать исключение. Это может вызвать неожиданные проблемы, иногда серьезные.
$ ocaml
OCaml version 4.02.1
# (+) < (+);;
Exception: Invalid_argument "equal: functional value".
# let rec cycle = 1 :: cycle;;
val cycle : int list = [1; <cycle>]
# cycle < cycle;;
((Does not terminate))
Операторы ocaml для строк сравнивают их чувствительность к регистру. –
и 'string a
Тег C++ не нужен. Я удалил его. – ApproachingDarknessFish