Нахождение номера Max / Min в списке в Ocaml - PullRequest
0 голосов
/ 29 сентября 2019

Я только недавно начал изучать Ocaml, а сейчас только начал практиковать некоторые коды. В этом случае я попытался найти максимальное число в списке, но он продолжает выдавать мне сообщение об ошибке.

let max: int list -> int
= fun lst ->
match lst with
 |[] -> 0
 |h::[] -> h
 |h::t -> let a = max t in
            if h < a then h
            else
             a;;

Ocaml продолжает говорить:

Ошибка: это выражение имеетТип int list -> int list, но ожидалось выражение типа int.

Я не понимаю, почему a - это список int, хотя я объявил его как max t, который является функцией, которая делаетсписок int в int ... Спасибо за помощь.

1 Ответ

2 голосов
/ 29 сентября 2019

a имеет тип int list -> int list, поскольку max в let a = max t относится не к вашей функции, а к той, которая определена в Stdlib. Stdlib (ранее назывался Pervasives) содержит определения, которые используются очень часто, и поэтому он открыт для вас по умолчанию.

Stdlib.max имеет тип 'a -> 'a -> 'a. Поэтому, когда вы передаете ему int list, компилятор выводит 'a как int list и возвращает функцию с типом int list -> int list.

Почему max не ссылается на ваш maxфункционировать? Потому что вы забыли ключевое слово rec. Как вы, наверное, уже знаете, rec делает функцию доступной для вызова внутри себя.

Вам следует избегать дублирования Stdlib имен функций, чтобы избежать путаницы в подобных ошибках. Если бы вы выбрали другое имя, вы просто получите сообщение об ошибке, что max не существует.

...