2017-01-14 28 views
1

私は「正方形」を持つ「リストのリスト」構造で作業したいsml-njプロジェクトを持っています。リストのリストに再帰的に値を挿入しようとしていますが、要素を2dリストに挿入する方法はまだ分かりません。 注 - これらの機能は、「REF」、「http://smlfamily.org/Basis/list.html#SIG:LIST.app:VAL」のみ使用できません。リストに挿入する2次元行列sml - 簡単なコード

datatype SquareContent = Mine | Digit of int | Blank; 
datatype Square = Revealed of SquareContent | Concealed of SquareContent; 
fun createMineSweeperGrid (n:int) 
:(Square list list)= 
let 
fun createMines (rowCounter:int, colCounter:int 
, retGame:Square list list):(Square list list) = 
if rowCounter=n then 
retGame   (* finished all rows, should be n lists of size n*) 
else 
if colCounter=n then (*finished current row, move on*) 
createMines (rowCounter+1, 0, mines,retGame) 
else 

let 
val squareToInsert = Concealed(Mine) (* I wish to insert 'squareToInsert'   
to retGame[rowCounter][colCounter], it's done dynamically, but I don't know 
how to do that *) 
in 
createMines (rowCounter, colCounter+1, retGame) 
end 

in 
createMines (0,0,[]) 
end 

私は広場のいずれかの種類を挿入することができ、それが動的に決定だと、ここで私は鉱山を隠しあなたは... HELPを私を助けることができる唯一の例を挙げましたか..?

答えて

2

標準MLでは、既存の構造を変更しないことが重要です。むしろ、新しいものを作成します。 (標準MLはサポート可変refビア構造体、およびその友人を行いますが、それは軽く何かではない、と私はあなたがすでに—が正しく—はそれを否定してきたこと。参照)一般的に

、したがって、挿入しますリンクされたリストの途中にあるものはかなり高価です。挿入したいポイントまでリストを「巻き戻し」してから値を挿入し、最後に解放したもののコピーを作成する必要があります。例えば、ここではインデックスリストのiで値xを挿入する機能があります:

fun insert (x, 0, L) = x :: L 
    | insert (x, i, h :: t) = h :: insert (x, i - 1, t) 
    | insert (_, _, nil) = raise Subscript 

は幸いなことに、あなたの関数が書かれ、既に構築されたリンクリストの真ん中に何かを挿入する必要がないように;むしろ、それが何をしようとしているのかを正しく理解していれば、最初ののの先頭に常に新しい正方形が置かれます。 「終了し、現在の行に移動し、」あなたはについてのコメントを持っていますが、それだけで進行する:だから:あなたが実際に新しい行を作成したことがないということであるあなたはまた別のバグを修正する必要があります

let 
    val squareToInsert = Concealed(Mine) 
    val topRow :: rest = retGame 
in 
    createMines (rowCounter, colCounter+1, (squareToInsert::topRow)::rest) 
end 

注意、同じ行にまだある場合とまったく同じです(新しい行に移動したかのように数字をリセットするだけです)。これを修正するには、最初に新しい行を追加する場合は[] :: retGameを、初期のボードには[]の代わりに[[]]を使用します(空の行から開始するように)。

+0

「temp:Square list」という関数を使って解決しました。追加したリストがretGameとsquareToInsertの両方に@によって記述されています。 – mooly

関連する問題