Вставка в список по индексу

Я пытаюсь вставить значение в "регистр" с 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
Другие вопросы по тегам