Я не понимаю, как ваш компилятор выдает эту ошибку. Ваш код содержит несколько ошибок, которые он должен обнаружить раньше:
- Вы неправильно используете метку.
- В другой руке вы сравниваете с ref
mmin
, а не с его содержанием - вы пропустили !
-.
- Вы путаете функцию
int_of_float
с Int.of_float
, которой не существует.
Кроме того, логический принцип функции не адекватен. Например, первое значение списка будет всегда вводиться в переменную mmax
, поскольку оно будет больше отрицательной бесконечности. Но что, если это значение было минимальным?
Помимо вышеизложенного, преобразование целого числа в число с плавающей точкой в этом случае не имеет смысла и приводит к потере точности и снижению производительности. Также нет необходимости использовать ссылки.
Это не канонический способ действовать в контексте OCaml. В OCaml важно попытаться найти самое простое из возможных решений, потому что, как только вы начинаете усложнять типы, вы теряете способность решать проблему.
Я предлагаю вам более простое решение проблемы с лицензией на создание полиморфной функции, а не только целых чисел:
let min_and_max lst =
(List.fold_left (fun a b -> if a < b then a else b) (List.hd lst) lst),
(List.fold_left (fun a b -> if a > b then a else b) (List.hd lst) lst);;
Это элегантный вариант, кроме того, он основан на терминальной рекурсии. Тем не менее, по этой схеме вы можете переопределить функции самостоятельно, не используя предопределенные для просмотра списков. Вы также можете выбрать два числа одним раундом, но это будет несколько сложнее.