如何解决将项目附加到 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-then
和 else
的优先级高于 ;
。
您可以通过括号将两个表达式合二为一:
if ... then ( l := 1 :: !l; !l ) else ...
您的代码中可能存在其他问题,但这就是您出现语法错误的原因。
,您实际上不需要使用 refs,因为您正在为新列表创建新绑定。对于像 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。