在 Ocaml 中的递归函数中调用递归函数时出现语法错误

时间:2021-04-22 19:58:28

标签: ocaml

编译器在使用命令时返回语法错误

xyz aux
    if((match4242 aux) = 0) then main (!list) else 1

这是我的完整代码。

open Printf
open Format

let regraUm m = m/2
  
let regraDois m = ((m / 10) mod 10) * (m mod 10)

let regraTres m = 42


let match4242 list =
    let a = ref 0 in
    let rec match42 list = 
    match list with
    |[]->[]
    |m::body->
    begin
    if (m = 42) then a := 1;
    match42 body
    end
    in match42 list;
    !a

let rec main aux = 
    let list = ref [] in
    let rec xyz aux = 
        let () = List.iter (fun x -> printf "%d " x) aux in
        match aux with
        |[]->[]
        |m::body -> 
        begin
        if ((m mod 2) = 0) then list := (m - (regraUm m))::!list;
        if ((m mod 3) = 0) || ((m mod 4) = 0) then 
            if (regraDois m <> 0) then
                list := (m - (regraDois m)) ::!list;
        if ((m mod 5) = 0) then list := (m - (regraTres m))::!list;
        xyz body
        end
    in xyz aux
    if((match4242 aux) = 0) then main (!list) else 1

程序检查 42 是否在列表中,如果不在,则它按照一组除法、减法等规则再次调用自己。 不知道最后这个信息对调试这段代码是否有帮助。

1 个答案:

答案 0 :(得分:2)

这两行:

   xyz aux
if ((match4242 aux) = 0) then main (!list) else 1

表示单个表达式,因为它们没有被 ; 分隔。但实际上你不能在这个位置(函数参数)有一个 if 表达式,除非你把它括起来。

很可能您需要在此处的 ; 之后的 aux

相关问题