Ошибка типа в OCaml
Я пытаюсь построить список индексов, где встречаются минимумы списка.
let rec max_index l =
let rec helper inList min builtList index =
match inList with
| [] -> builtList
| x :: xs ->
if (x < min) then
helper xs x index :: builtList index + 1 //line 63
else
helper xs min builtList index + 1
in helper l 100000 [] 0;;
Это дает мне следующую ошибку для строки 63.
Error: This expression has type 'a list -> 'a list
but an expression was expected of type 'a
The type variable 'a occurs inside 'a list -> 'a list
Ожидалось выражение типа ' a? Я не знаю, почему он так говорит. Я думаю, что это имеет какое-то отношение к index::builtList
2 ответа:
Проблема, с которой вы столкнулись, заключается в том, что вы пытаетесь передать не-список вашей вспомогательной функции в строке 65 (helper xs x index :: builtList index + 1 //line 63 else helper xs x index min index + 1
min
), пытаясь передатьint list
тому же параметру в строке 63. Попробуйте заменитьmin
на[min]
илиmin::[]
.Правка:
После обновления проблема заключается в том, что вызовы функций остаются ассоциативными и имеют более высокий приоритет, чем бинарные операторы (см. здесь), поэтому
helper xs x index
будет выполняться доindex :: builtList
и аналогичноhelper xs x index :: builtList
будет выполняться доindex + 1
. Чтобы получить правильный порядок вычисления, вам нужно поставить скобки вокруг других вызовов функций, т. е.::
и+
плюс их параметры, такие как:helper xs x (index :: builtList) (index + 1) //line 63 else helper xs x index min (index + 1)