开始Ocaml - 返回未实现的测试用例

时间:2012-01-19 13:00:48

标签: ocaml

现在我开始使用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 个答案:

答案 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

我知道你已经开始了,所以你可以把它留到另一天,但我会提到(没有解释)你应该使用变体或可能的多态变体而不是直接检查字符串。