【发布时间】:2017-01-31 11:10:24
【问题描述】:
我刚开始学习 SML,我想编写一个程序,它需要 2 个 int 和一个元组列表,对它们进行更改,然后返回一个列表(BOXES 是一个列表)。列表总是有 2 个元组。在某些情况下,我需要更改元组中元素的数量。例如,我定义 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 怎么了?
【问题讨论】:
-
(Yb1=Yb1-1 ; Yb2=Yb2-1 ; boxes)毫无意义。它只返回boxes。您的所有子句无一例外地返回boxes不变。你在思考。boxes不会改变。Yb1 = Yb1-1也只是一个平等测试。它返回值 false,然后将其丢弃。你似乎试图用(Yb1=Yb1-1 ; Yb2=Yb2-1 ; boxes)做某种let ... in ... end构造。无论如何——您应该显示BOXES的定义。我们不必猜测它是什么。 -
那么我怎样才能改变 Yb1 和 ... 的数量?如何增加或减少金额,然后返回更改后的值?
-
在这种情况下直接返回您希望
boxes的值。我真的不太确定那是什么,因为我发现您的代码的意图有些模糊。 -
如果你提供一些有代表性的输入和预期的输出可能会有所帮助。说明你希望
MoveBox会做什么。它与框和动作有什么关系? -
我正在使用 cpn 工具,模拟一个像推箱子这样的游戏,其中一个人试图将 2 个盒子移动到所需的位置,这个函数用于将盒子移动到左边。所以每次它以工人的位置(Xw,Yw)和盒子的位置(作为一个列表)作为输入,并决定盒子是否可以向左移动。当盒子返回不变时,意味着它们不能向左移动,每次它改变时,这意味着盒子可以移动,所以值应该改变。问题是我不知道如何直接改变列表中元组的值。
标签: sml