2015-07-01 5 views
1

Мне любопытно, как большие, чем (>) и менее (<) операторы работают с типами, которые не являются int, float или double в OCaml.Как работают операторы OCaml < and > с нецелыми типами?

Например, я смог обнаружить эту строку «a»> «b», но есть ли какая-либо ссылка, в которой перечислены соглашения для всех нецифровых типов данных. Кроме того, как эти операторы работают в разных типах? например Действительно ли «a»> true или «a» <?

И, наконец, как они будут работать через определенный пользователем тип данных?

Спасибо!

+0

Операторы ocaml для строк сравнивают их чувствительность к регистру. –

+0

и 'string a

+1

Тег C++ не нужен. Я удалил его. – ApproachingDarknessFish

ответ

5

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)) 
+1

Кроме того, постоянные конструкторы меньше непостоянных, и они упорядочены по порядку объявления. Кортежи также имеют лексикографическое упорядочение. Массивы, по-видимому, упорядочены по размеру, а затем по лексикографическому порядку. – PatJ

+0

Это верно, но не документированы. Поэтому теоретически они могут измениться со следующей версией OCaml. –

+0

Также недокументированные списки лексикографически упорядочены. Хотя этот результат может быть получен просто из того, что конструктор с постоянным пустым списком должен быть упорядочен до конструктора непостоянных cons, а в противном случае данные минусов лексикографически упорядочены как кортеж. – newacct