Ошибка типа в 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 + 1min), пытаясь передать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)