我正在尝试将一个值插入"寄存器"用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之间的值。 我哪里错了?
答案 0 :(得分:1)
你的基本逻辑没问题。只是一些语法错误:
1)t
在valIns::t
中未绑定。你无疑意味着tail
2)首先定义fun storeInReg [] valIns idx
(SML中常见的多变量函数的curried形式),然后再使用像
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