2016-09-15 4 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でバインドされていません。あなたは間違いなくあなたはSMLでの一般的な多変数関数のfun storeInReg [] valIns idx(カリー化形式)を定義することによって開始するが、その後、後であなたが(合格しようとしているように見える

storeInReg([] valIns (idx-1)) 

のようなものを使用しtail

2)を意味します不正な形式の)タプルをstoreInRegに変換します。なりた - その代わりに、関数の評価はSMLで可能な限り最高の優先順位、headに関数を適用し、その後tail valIns idxに結果を連結しようとする

ので、表現

storeInReg head::tail valIns idx 
を持っている)

(storeInReg [] valIns (idx-1)) 

3が必要も意味ない。

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)); 

それは今、期待通りに動作します:代わりに、

storeInReg (head::tail) valIns idx 

は、これらの変更の収量を作る必要がある

- 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 
関連する問題