SML - 更改元组列表中元组元素的值

时间:2017-01-31 01:24:43

标签: sml

我刚开始学习SML,我想编写一个程序,它接受2个int和一个元组列表,对它们进行更改然后返回一个列表(BOXES是一个列表)。列表总是有2个元组。在某些if条件中,我需要更改元组中元素的数量。因此,例如我定义了Xb1,并且我给它了元组的第一个元素的数量(#1 head),然后我更改了代码中的Xb1的数量(并返回列表)。但问题是这个数量没有改变。 这是代码:

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 怎么了?

1 个答案:

答案 0 :(得分: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;

我将您的headtail分别重命名为box1box2。 (并修复了你向tail提供错误值的错误)并使用模式匹配来使绑定更容易理解。更重要的是,我更换了

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

通过

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

这就是我在评论中的意思,当我说你应该直接返回你想要的新值时。

似乎可以通过使用orelse将具有相同返回值的子句组合到单个条件中来清除逻辑。