2016-09-15 100 views
1

我试图用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

您的基本逻辑没问题。只有几个语法错误:

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