Ваша основная логика в порядке. Всего несколько синтаксических ошибок:
1) t
несвязано в valIns::t
. Вы, несомненно, имели в виду tail
2) Вы начинаете с определением fun storeInReg [] valIns idx
(в Curried формы нескольких переменных функции общих в 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