Цель OCaml for
- сделать что-то, а не вычислить значение.Таким образом, тело цикла должно быть выражением OCaml, которое имеет полезный побочный эффект (например, печать значения).По этой причине тело цикла for
должно иметь тип unit
, тип, используемый для выражений, которые не имеют интересного значения.Но у вашего цикла есть тело, которое является списком.Компилятор говорит вам (правильно), что это указывает на то, что что-то не так.
Ваш код написан в предположении, что выражение (n, j) :: lst
изменит значение lst
.Но это не так.В функциональном языке, таком как OCaml, вы не можете изменять значения переменных.
Если ваша функция должна возвращать список, она не может быть основана на цикле for
, который всегда возвращает ()
(уникальное значение типа unit).Скорее всего, это должно быть основано на сгибе (который накапливает значение при работе через серию входов) или на вашей собственной рекурсивной функции.