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
не существует.