我刚开始学习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 怎么了?
答案 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;
我将您的head
和tail
分别重命名为box1
和box2
。 (并修复了你向tail
提供错误值的错误)并使用模式匹配来使绑定更容易理解。更重要的是,我更换了
(Yb1=Yb1-1 ; Yb2=Yb2-1 ; boxes)
通过
[(Xb1,Yb1-1),(Xb2,Yb2-1)]
这就是我在评论中的意思,当我说你应该直接返回你想要的新值时。
似乎可以通过使用orelse
将具有相同返回值的子句组合到单个条件中来清除逻辑。