现在我开始使用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
答案 0 :(得分:4)
很可能是因为你到处都有语法错误而且move_robot
从未被加载到顶层。 Syntax Error
消息应该非常明显,无论您在OCaml中启动函数式编程时是否存在概念错误。
虽然第一个if
语句具有无关的in
,但它也不应在其语句中设置变量但返回一些值。一般来说,你处理w /并设置new_position
的方式非常类似,如果你修复了第一个语法错误,你会立即发现你从未改变过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
我知道你已经开始了,所以你可以把它留到另一天,但我会提到(没有解释)你应该使用变体或可能的多态变体而不是直接检查字符串。