Есть несколько проблем с вашим кодом.
Ошибка в том, что for
ничего не возвращает, и поэтому внутренняя часть цикла должна быть чисто для побочного эффекта. Так что у него должен быть тип юнита. Использование =
не имеет типа блока, потому что =
фактически является оператором равенства, сравнивая два значения и возвращая true
или false
.
Итак, вы используете неправильный оператор. Похоже, что вы пытаетесь «назначить» на x
. Но в ML вы не можете присваивать «переменным», потому что они связаны со значением, когда они определены и не могут изменяться. Одним из способов получения изменчивости является использование изменяемой ячейки (называемой «ссылкой»): вы используете функцию ref
для создания изменяемой ячейки из начального значения; оператор !
для получения значения; и оператор :=
для изменения значения внутри.
Так, например:
let f q p rho=
let x = ref [] in
if q > p then
for i=0 to rho do
x := q :: !x
done;
!x;;