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

开始Ocaml-返回未实现的测试用例,ocaml,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

现在我刚开始使用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 
让rec移动机器人(pos:int)(dir:string)(num\u移动:int):int=
让新位置=位置进入
如果dir=“forward”,则新位置=位置+数量移动
否则,如果dir=“backward”,则新位置=pos-num\u移入
如果新位置>=99,则为99

否则,如果新位置很可能是因为到处都有语法错误,
move\u robot
从未加载到顶层<代码>语法错误
消息应该非常明显,不管您在使用OCaml启动函数式编程时经常犯概念错误

尽管第一个
if
语句在中有一个无关的
,但它也不应该在其语句中设置变量,而是返回一些值。一般来说,处理w/并设置
new\u position
的方式非常类似于C,如果修复了第一个语法错误,您会立即发现从未更改
new\u 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
正如你所看到的,我们从不试图修改新的位置;这与函数式程序员喜欢的不变性相一致。还请注意,如果没有包含最终的
else
语句,则会出现类型检查错误。排除它是返回
unit
的语法,但返回一个整数。更好的(我认为通常比
if
语句更简洁)是使用模式匹配

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

我知道您即将开始,所以您可以将此留到另一天,但我只想提及(无需解释)您应该使用变体或可能的多态变体,而不是直接检查字符串。

谢谢您的帮助!我的第一语言是C,所以是的;在声明中用ifs声明变量的想法太奇怪了。我知道这很迂腐,但这些不是变量;它们是价值观。变量意味着易变性。这可能同样迂腐,但这些都是变量。50年来的术语滥用让大多数编程人员忘记了它在古老的数学意义上的真正含义。可变类型的变量更准确地称为可变引用、单元格或其他同义词