assert в одной автономной программе ocaml - PullRequest
0 голосов
/ 25 мая 2020

Прочитав эту ветку , помещаю этот код в свой .ml файл:

let x = [3;5;9]
(* Testing append to the list *)
let () = assert( x @ [2;10] == [3;5;9;2;10])

и запускаю

$ ocamlc -o BasicList BasicList.ml  && ./BasicList 
Fatal error: exception Assert_failure("BasicList.ml", 3, 9)
  • Почему это возникает ошибка?
  • Есть ли другой эффективный или полезный способ проверить мои функции? Большинство учебников, которые я читал, демонстрируют только в REPL. Я новичок в Ocaml, так что было бы приятно получить известие от вашего опыта.

1 Ответ

2 голосов
/ 25 мая 2020

Прочтите документацию Ocaml.

В недавних Stdlib вы, вероятно, захотите использовать оператор структурного равенства = и код

 assert( x @ [2;10] = [3;5;9;2;10])

Обратите внимание, что == кодирует оператор физического равенства («указателей», точнее, физических значений в штучной упаковке).

val (==) : 'a -> 'a -> bool

e1 == e2 тестов на физическое равенство e1 и e2. Для изменяемых типов, таких как ссылки, массивы, последовательности байтов, записи с изменяемыми полями и объекты с изменяемыми переменными экземпляра, e1 == e2 истинно тогда и только тогда, когда физическая модификация e1 также влияет на e2. Для неизменяемых типов поведение ( == ) зависит от реализации; однако гарантируется, что e1 == e2 подразумевает сравнение e1 e2 = 0. Левоассоциативный оператор, см. Ocaml_operators для больше информации.

Кстати, ocaml язык программирования имеет и реализацию с открытым исходным кодом. Вам следует изучить его исходный код.

Имейте в виду, что сравнение с = двумя длинными списками длиной n имеет временную сложность из O ( п) . Но == - это постоянное время. Для списков из многих тысяч элементов, которые имеют значение.

В качестве упражнения закодируйте эквивалент = для списков (например, используя только letrec, match и ==).

...