插入索引的列表

时间:2016-09-15 05:41:30

标签: sml smlnj

我正在尝试将一个值插入"寄存器"用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 个答案:

答案 0 :(得分:1)

你的基本逻辑没问题。只是一些语法错误:

1)tvalIns::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