2017-01-31 15 views
1

私はSMLの学習を始めました.2つのintとタプルのリストを取り、リストを返すプログラムを作成したいと思います(ボックスはリストです)。リストには常に2つのタプルがあります。いくつかのif条件では、タプル内の要素の量を変更する必要があります。たとえば、私はXb1を定義し、それにタプルの最初の要素(#1頭)の量を与え、その後、コード内のXb1の量を変更してリストを返します。しかし問題は、この金額は変更されないということです。SML - タプルのリスト内のタプル要素の値を変更する

fun MoveBoxL(Xw,Yw,boxes:(int * int)list) : BOXES = 
let 
val head = List.hd boxes 
val tail = List.hd boxes 
val Xb1= #1(head) 
val Yb1 = #2(head) 
val Xb2 = #1(tail) 
val Yb2 = #2(tail) 
in 
if Yw=1 then boxes 
else if head=(Xw,1) andalso Yw=2 then boxes 
else if tail=(Xw,1) andalso Yw=2 then boxes 
else if Yw=3 andalso head=(Xw,1) andalso tail=(Xw,2) then boxes 
else if Yw=3 andalso tail=(Xw,1) andalso head=(Xw,2) then boxes 
else if head=(Xw, Yw-2) andalso tail=(Xw, Yw-1) then (Yb1=Yb1-1 ; Yb2=Yb2-1 ; boxes) 
else if head=(Xw, Yw-1) andalso tail=(Xw, Yw-2) then (Yb2=Yb2-1 ; Yb1=Yb1-1 ; boxes) 
else if head=(Xw,Yw-1) then (Yb1=Yb1-1 ; boxes) 
else if tail=(Xw,Yw-1) then (Yb2=Yb2-1 ; boxes) 
else boxes 
end; 

cpn tools picture 間違っているものです: ここでは、コードのですか?

+0

'(Yb1 = Yb1-1; Yb2 = Yb2-1;ボックス)'ほとんど意味がありません。 'boxes'を返すだけです。例外を除いてあなたの句のすべては '箱'をそのまま返します。あなたは必然的に考えています。 'boxes'は変更されません。また、 'Yb1 = Yb1-1'も同等のテストに過ぎません。値falseが返され、破棄されます。あなたは、 '(Yb1 = Yb1-1; Yb2 = Yb2-1; boxes)'という何らかの 'let ... in ... end'構造をしようとしているようです。いずれにせよ、あなたは 'BOXES'の定義を示すべきです。それが何であるかを推測する必要はありません。 –

+0

Yb1の量を変更するにはどうしたらいいですか?金額を増減してから変更した値を返すにはどうすればよいですか? – helen

+0

この場合、 'boxes 'にしたい値を直接返すだけです。私はあなたのコードの意図がやや不明確であることを知っているので、それが何であるかは本当に分かりません。 –

答えて

1

私はまだ動いて箱のためにこれらのルールが何であるかを100%わからないんだけど、次はあなたの意図をキャプチャするようだ:

fun MoveBoxL(Xw,Yw,boxes:(int * int)list) = 
let 
    val [box1,box2] = boxes 
    val (Xb1,Yb1) = box1 
    val (Xb2,Yb2) = box2 
in 
    if Yw = 1 then boxes 
    else if box1=(Xw,1) andalso Yw=2 then boxes 
    else if box2=(Xw,1) andalso Yw=2 then boxes 
    else if Yw=3 andalso box1=(Xw,1) andalso box2=(Xw,2) then boxes 
    else if Yw=3 andalso box2=(Xw,1) andalso box1=(Xw,2) then boxes 
    else if box1=(Xw, Yw-2) andalso box2=(Xw, Yw-1) then [(Xb1,Yb1-1),(Xb2,Yb2-1)] 
    else if box1=(Xw, Yw-1) andalso box2=(Xw, Yw-2) then [(Xb1,Yb1-1),(Xb2,Yb2-1)] 
    else if box1=(Xw,Yw-1) then [(Xb1,Yb1-1),box2] 
    else if box2=(Xw,Yw-1) then [box1,(Xb2,Yb2-1)] 
    else boxes 
end; 

私はそれぞれbox1box2であるためにあなたのheadtailの名前を変更しました。 (そしてあなたが間違った値をtailに与えていたあなたのバグを修正しました)、パターンマッチングを使用してバインディングを理解しやすくしました。さらに重要なことは、私はあなたが直接あなたが新しい値になりたいものを返すべきであると言ったとき、私はコメントで何を意味するのかである

[(Xb1,Yb1-1),(Xb2,Yb2-1)] 

によって

(Yb1=Yb1-1 ; Yb2=Yb2-1 ; boxes) 

を置き換えます。

orelseを使用して、単一の条件に同じ戻り値を持つ節を組み合わせることで、ロジックをクリーンアップできるようです。

+0

を返します。ありがとう:) – helen

関連する問題