在索引处插入列表

Inserting into a list at an index

我正在尝试使用 SML 向 "register" 中插入一个值。如果列表(或寄存器)未在该索引处定义,我需要在该索引之前制作一个 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) tvalIns::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