Вставка в список по индексу
Я пытаюсь вставить значение в "регистр" с SML. Если список (или регистр) не определен в этом индексе, мне нужно составить список от 0 до этого индекса. Я попытался следующее, но не могу заставить его работать.
fun storeInReg [] valIns idx =
if idx = 0 then
[valIns]
else
0::storeInReg( [] valIns (idx-1))
| storeInReg head::tail valIns idx =
if idx = 0 then
valIns::t
else
head::storeInReg(tail valIns (idx-1));
Значение idx может быть только в диапазоне от 0 до 9. Где я ошибаюсь?
1 ответ
Ваша основная логика в порядке. Всего несколько синтаксических ошибок:
1) t
не связан в valIns::t
, Вы, несомненно, имели в виду tail
2) Вы начинаете с определения fun storeInReg [] valIns idx
(карри в форме многопараметрических функций, распространенных в SML), но затем использовать такие вещи, как
storeInReg( [] valIns (idx-1))
где вы, кажется, пытаетесь передать (плохо сформированный) кортеж storeInReg
, Вместо этого вам нужно
(storeInReg [] valIns (idx-1))
3) Функция оценки имеет наивысший возможный приоритет в SML, таким образом, выражение
storeInReg head::tail valIns idx
пытается применить функцию к head
а затем объединить результат tail valIns idx
- что не имеет смысла. Вместо этого вам нужно
storeInReg (head::tail) valIns idx
Внесение этих изменений приводит к:
fun storeInReg [] valIns idx =
if idx = 0 then
[valIns]
else
0::(storeInReg [] valIns (idx-1))
| storeInReg (head::tail) valIns idx =
if idx = 0 then
valIns::tail
else
head::(storeInReg tail valIns (idx-1));
Теперь он работает как положено:
- val r = storeInReg [] 5 9;
val r = [0,0,0,0,0,0,0,0,0,5] : int list
- storeInReg r 4 3;
val it = [0,0,0,4,0,0,0,0,0,5] : int list