在索引处插入列表
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) 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
我正在尝试使用 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) 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