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