Начало Ocaml - тестовые случаи возвращаются неосуществленными - PullRequest
3 голосов
/ 19 января 2012

сейчас я начинаю с 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 

1 Ответ

4 голосов
/ 19 января 2012

Скорее всего, это потому, что у вас везде есть синтаксические ошибки, а move_robot никогда не загружался на верхний уровень. 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

Я знаю, что вы начинаете, так что вы можете оставить это на другой день, но я просто упомяну (без объяснения причин), что вы должны использовать варианты или, возможно, полиморфные варианты вместо прямой проверки строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...