将项目附加到 Ocaml 中的列表时出现语法错误

Syntax Error when Appending item to List in Ocaml

这是我的完整代码:

let xyz m l =
    let r1 l m = if ((m mod 2) = 0) then l:=1::!l; !l else !l in r1 l m


let l = ref []
let y = xyz 250 l

let () = List.iter (fun x -> print_int x) y

它返回以下错误:

ocamlopt loops.ml -o l
File "loops.ml", line 21, characters 54-58:
21 |     let r1 l m = if ((m mod 2) = 0) then l:=1::!l; !l else !l in r1 l m
                                                           ^^^^
Error: Syntax error

此代码:

l := 1 :: !l; !l

是由;分隔的两个表达式。但是,then 之后只能出现一个表达式。由于您有两个表达式,因此当 else 出现时,语法上不再允许它。

另一种看待它的方式是 if-thenelse 的优先级高于 ;

您可以通过括号将两个表达式合二为一:

if ... then ( l := 1 :: !l; !l ) else ...

您的代码中可能存在其他问题,但这是您出现语法错误的原因。

您实际上不需要使用引用,因为您正在为新列表创建新的绑定。对于像 OCaml 这样的函数式编程语言,无论如何最好避免使用它们。

let xyz m l =
    let r1 l m = if ((m mod 2) = 0) then 1 :: l else l in
        r1 l m

let l = []
let y = xyz 250 l

let () = List.iter (fun x -> print_int x) y

您的代码现在看起来更简单,您甚至不需要额外的内部闭包和匿名函数:

let xyz m l =
    if ((m mod 2) = 0) then 1 :: l else l

let l = []
let y = xyz 250 l

let () = List.iter print_int y