방금 SML을 배우기 시작했는데 2 int와 튜플 목록을 가져 와서 변경 한 다음 목록을 반환하는 프로그램을 작성하려고합니다. (상자는 목록입니다). List에는 항상 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 무슨 일이야 : 여기에 코드?
'(Yb1 = Yb1-1; Yb2 = Yb2-1; 상자)'거의 의미가 없습니다. 그냥 상자를 반환합니다. 예외가없는 모든 조항은'상자 '를 변경하지 않고 반환합니다. 당신은 절대적으로 생각하고 있습니다. 'boxes'는 바뀌지 않습니다. 또한 'Yb1 = Yb1-1'은 동등성 테스트 일뿐입니다. 값 false를 반환하고이를 버립니다. 여러분은'(Yb1 = Yb1-1; Yb2 = Yb2-1; boxes)'와 함께 일종의'let ... in ... end' 구조를 시도하는 것으로 보입니다. 어떤 경우 든 - 당신은'상자들 '의 정의를 보여 주어야합니다. 우리는 그것이 무엇인지 짐작할 필요가 없습니다. –
그러면 어떻게 Yb1의 양을 변경할 수 있습니까? ...? 금액을 어떻게 늘리거나 줄인 다음 변경된 값을 반환 할 수 있습니까? – helen
이 경우에는'boxes'가 원하는 값을 직접 반환하면됩니다. 나는 당신의 코드의 의도가 다소 모호하다는 것을 알기 때문에 그게 무엇인지는 정말로 확신하지 못합니다. –