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

SML-更改元组列表中元组元素的值,sml,Sml,我刚刚开始学习SML,我想写一个程序,它接受2个int和一个元组列表,对它们进行更改,然后返回一个列表(box是一个列表)。列表总是有2个元组。在某些if条件下,我需要更改元组中元素的数量。例如,我定义了Xb1,给了它元组第一个元素的数量(#1 head),然后我在代码中更改了Xb1的数量(并返回列表)。但问题是这个数额没有改变。 代码如下: fun MoveBoxL(Xw,Yw,boxes:(int * int)list) : BOXES = let val head = List.hd bo

我刚刚开始学习SML,我想写一个程序,它接受2个int和一个元组列表,对它们进行更改,然后返回一个列表(box是一个列表)。列表总是有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;

出什么问题了?

我仍然不能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;
我把你的
分别重命名为
box1
box2
。(并修复了您给
tail
赋予错误值的错误)并使用模式匹配使绑定更容易理解。更重要的是,我替换了

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

这就是我在评论中所说的,你应该直接返回你想要的新值


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

(Yb1=Yb1-1;Yb2=Yb2-1;方框)
没有什么意义。它只返回
。您的所有子句都将返回未更改的
框。你的想法是强制性的<代码>框
不会更改。而且
Yb1=Yb1-1
只是一个平等性测试。它返回值false,然后丢弃该值。你似乎通过尝试做一些<代码>让。。。在里面用
(Yb1=Yb1-1;Yb2=Yb2-1;方框)结束
构造。在任何情况下,您都应该显示
框的定义。我们不应该猜它是什么。那么我怎样才能改变Yb1和?如何增加或减少金额,然后返回更改后的值?在这种情况下,只需直接返回您希望的值。我真的不太确定那是什么,因为我发现你的代码的意图有些模糊。如果你给出一些有代表性的输入和预期的输出,可能会有所帮助。说明您希望移动框能做什么。它与盒子和运动有什么关系?我正在使用cpn工具,模拟一个像sokoban这样的游戏,其中一个人试图将两个盒子移动到所需的位置,这个函数用于将盒子向左移动。因此,每次它都会将worker的位置(Xw,Yw)和box的位置(作为列表)作为输入,并决定box是否可以向左移动。当框返回不变时,这意味着它们不能向左移动,每次改变时,这意味着框可以移动,因此值应该改变。问题是我不知道如何直接更改列表中元组的值。
[(Xb1,Yb1-1),(Xb2,Yb2-1)]