2017-02-15 5 views
2

Предположим, у меня есть списки int [1; 2; 3] и [4; 3; 5], где каждая цифра в числе.Как достоверно сравнить значения целого числа или значения float в списке?

Игра вокруг на OCaml Я вижу, что:
[1; 2; 3] > [4; 3; 5];; вычисляет false,
в то время как [1; 2; 3] < [4; 3; 5];; вычисляется в true.

Со списками разной длины ...
[4; 5] > [1;2;3] и [4; 5] > [1;9;3] вычисляться TRUE, что это странно.

Похоже, что он сравнивает каждый отдельный элемент, и если одна пара не удовлетворяет неравенству, тогда он возвращает false, но если списки не имеют одинаковой длины, то только сравниваются соответствующие элементы, которые он может сравнивать и игнорирует отдых.

Однако я проверяю модуль List и распространяющийся модуль, и я не могу найти документацию, точно определяющую, как эта функция работает.

Может ли кто-нибудь категорически подтвердить, добавить или противоречить тому, что я уже вывел?

ответ

4

Для списков простых значений (например, целых чисел и символов) полиморфное сравнение использует «лексикографический порядок». Он работает как порядок слов в словаре. По сути, начинайте в начале списка и сравнивайте соответствующие элементы, пока они не будут разными. Тогда сравнение зависит от порядка двух разных элементов. Если вы достигнете конца одного списка перед другим (без различий до этой точки), более короткий список будет меньше, чем дольше. Если вы достигнете конца обоих списков одновременно (без различий до этой точки), списки равны.

Следуя этому же набору правил, «the» появляется перед «then» в словаре, а после «them» появляется «then». Вы можете проверить это с помощью списков OCaml ['t'; 'h'; 'e'], ['t'; 'h'; 'e'; 'n']; ['t'; 'h'; 'e'; 'm'].

Однако, когда я тщательно изучил это, я обнаружил, что функция полиморфного сравнения OCaml для структурированных значений (например, списки, записи и т. Д.) Не определена. Единственное, на что можно положиться, это то, что он последователен.

Документация на Pervasives module говорит только это:

Эти функции совпадают с обычными порядками над целыми числами, символами, строками, последовательности байтов и чисел с плавающей точкой, и раздвинуть их до полного упорядочения по всем типы. Заказ сопоставим с (=). Как и в случае (=), изменяемые структуры сравниваются по содержанию. Сравнение между функциональными значениями повышается Invalid_argument. Сравнение циклических структур может не заканчиваться.

Если вам нужен определенный заказ, вы должны написать свою собственную функцию сравнения.

Смежные вопросы