2017-01-31 1 views
1

방금 ​​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 무슨 일이야 : 여기에 코드?

+0

'(Yb1 = Yb1-1; Yb2 = Yb2-1; 상자)'거의 의미가 없습니다. 그냥 상자를 반환합니다. 예외가없는 모든 조항은'상자 '를 변경하지 않고 반환합니다. 당신은 절대적으로 생각하고 있습니다. 'boxes'는 바뀌지 않습니다. 또한 'Yb1 = Yb1-1'은 동등성 테스트 일뿐입니다. 값 false를 반환하고이를 버립니다. 여러분은'(Yb1 = Yb1-1; Yb2 = Yb2-1; boxes)'와 함께 일종의'let ... in ... end' 구조를 시도하는 것으로 보입니다. 어떤 경우 든 - 당신은'상자들 '의 정의를 보여 주어야합니다. 우리는 그것이 무엇인지 짐작할 필요가 없습니다. –

+0

그러면 어떻게 Yb1의 양을 변경할 수 있습니까? ...? 금액을 어떻게 늘리거나 줄인 다음 변경된 값을 반환 할 수 있습니까? – helen

+0

이 경우에는'boxes'가 원하는 값을 직접 반환하면됩니다. 나는 당신의 코드의 의도가 다소 모호하다는 것을 알기 때문에 그게 무엇인지는 정말로 확신하지 못합니다. –

답변

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에 부여한 곳의 버그를 고쳤습니다.) 그리고 바인딩을 더 쉽게 이해할 수 있도록 패턴 일치를 사용했습니다. 더 중요한 것은, 내가 직접 새 값이 원하는 무엇을 반환해야 함을 말했을 때 나는 코멘트에 무엇을 의미하는지 어느

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

에 의해

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

를 교체했다.

orelse을 사용하여 단일 조건에 동일한 반환 값을 가진 절을 결합하여 논리를 정리할 수있는 것처럼 보입니다.

+0

을 반환합니다. 감사 :) – helen