2016-09-15 5 views
1

Я пытаюсь вставить значение в регистр с SML. Если список (или регистр) не определен в этом индексе, мне нужно составить список 0s до этого индекса. Я попытался сделать следующее, но не могу заставить его работать.Вставка в список по индексу

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 (в 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 

 Смежные вопросы

  • Нет связанных вопросов^_^