Ошибка типа в 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 3

2 ответа:

        helper xs x index :: builtList index + 1 //line 63
    else
        helper xs x index min index + 1
Проблема, с которой вы столкнулись, заключается в том, что вы пытаетесь передать не-список вашей вспомогательной функции в строке 65 (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)

Вам нужны некоторые скобки. Вызов функции связывает сильнее, чем бинарные операторы. Итак

if (x < min) then
    helper xs x (index :: builtList) (index + 1)
else
    helper xs min builtList (index + 1)