2012-01-19 5 views
3

지금은 Ocaml을 시작하고 있지만 문제가 있습니다. 이 코드를 입력하면 테스트 케이스에서 코드를 구현했지만 구현되지 않았다고보고합니다. 어떤 종류의 구문 오류가 있습니까? 나는 언어에 진짜로 이렇게 이용된다. 미리 감사드립니다. 당신이 사방에 구문 오류가있어 move_robot 최상위 수준에로드 된 적이 있기 때문에Ocaml 시작 - 구현되지 않은 테스트 케이스가

let rec move_robot (pos: int) (dir: string) (num_moves: int) : int = 
    let new_position=pos in 
     if dir="forward" then new_position=pos+num_moves in 
     else if dir="backward" then new_position=pos-num_moves in 
     if new_position>=99 then 99 
     else if new_position<=0 then 0 
     else new_position 

let test() : bool = 
    (move_robot 10 "forward" 3) = 13 
    ;; run_test "move_robot forward 3" test 

let test() : bool = 
    (move_robot 1 "backward" 4) = 0 
    ;; run_test "move_robot backward 4" test 

답변

4

대부분의 경우가 있습니다. Syntax Error 메시지는 OCaml에서 함수 프로그래밍을 시작하는 데있어서 공통적 인 개념상의 실수와는 상관없이 매우 분명해야합니다.

첫 번째 if 문에는 외부 항목 in이 있지만 명령문에 변수를 설정하지 말고 값을 반환해야합니다. 일반적으로 w /를 처리하는 방법과 new_position을 설정하는 것은 매우 C이며, 첫 번째 구문 오류를 수정하면 즉시 new_position 값을 변경하지 않았 음을 알게됩니다. if 문과 그 밖의 다른 문은 값을 반환해야하며 더 큰 범위의 변수를 변경하려고 시도하지 않습니다. 여기서는 참조를 사용합니다. 여기서는 필요하지 않습니다. 당신이 볼 수있는

let new_position = 
    if dir = "forward" then pos+num_moves 
    else if dir = "backward" then pos-num_moves 
    else failwith ("Invalid Direction: "^dir) 
in 

, 우리는 지금까지 new_position을 수정하려고하지 않는다; 기능적 프로그래머가 좋아하는 불변과 맞 춥니 다. 또한 최종 else 문을 포함하지 않으면 유형 검사 오류가 발생합니다. 그것을 제외하면 unit을 반환하는 구문 설탕이지만 정수를 반환합니다. (그리고 내가 if 문에 비해 일반적으로 청소기 생각) 더 나은 난 당신이 밖으로 시작하는 거 알아, 패턴 매칭을 사용하는

let new_position = match dir with 
    | "forward" -> pos+num_moves 
    | "backward" -> pos-num_moves 
    | _   -> failwith ("Invalid Direction: "^dir) 
in 

, 그래서하지 않고 (다른 일이 떠날 수 있지만 난 그냥 말할 수 있습니다 설명) 문자열을 직접 확인하는 대신 변형 또는 다형성 변형을 사용해야합니다.

+0

도움을 주셔서 감사합니다! 제 첫 번째 언어는 C였습니다. 선언문 안에 if를 사용하여 변수를 선언하는 것은 이상한 생각입니다. – flymonkey

+0

나는 이것이 대담하다는 것을 알고 있지만 이것은 변수가 아닙니다. 그들은 가치입니다. 변수는 변경 가능성을 의미합니다. – nlucaroni

+0

아마도 똑같이 똑똑 할 것이지만, 이들은 * 변수입니다. 50 년에 걸친 용어 학대로 인해 대부분의 명령형 프로그래머는 좋은 오래된 수학적 의미에서 실제로 의미하는 것을 잊어 버렸습니다. 변경 가능한 종류의 변수는 더 정확하게 가변 참조, 셀 또는 다른 동의어라고합니다. ;) –

관련 문제