2016-09-15 116 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 
相關問題