我正在尝试使用OCaml语言编写程序,但是在使用嵌套函数时遇到了问题。这是我写的代码:
let prime : int -> bool
= fun x ->
if x > 2 then
let a = x - 1 in
let rec checkZero a x =
if a > 1 then
match x mod a with
0 -> false
|_ -> checkZero (a - 1) x
else if a = 1 then
true
else if x = 2 then
true
else
false
;;
为简要说明我的代码,我使用一个称为checkZero
的嵌套函数来确定x
是否可被以a
开头的值x - 1
整除。然后下降到2。
执行模式匹配后,如果mod
操作的结果为0,则x
不是质数,如果结果为其他,则我们从{{1}中减去1。 },然后再次执行a
。
我收到的特定错误消息是,我在双分号所在的位置出现语法错误。
我不太了解OCaml的工作方式,但是我确实知道当您希望整个代码成为表达式时会使用双分号。 不过,我不太确定是什么导致了错误。
任何反馈都值得赞赏。谢谢!
答案 0 :(得分:0)
我发现了这个问题,现在感觉很傻。我希望它可以帮助其他在类似问题上苦苦挣扎的人。
正如@glennsl在对该问题的评论中所指出的那样,我所缺少的一件事是“ let ... in
之后必须是调用它的表达式。”我的代码的问题在于checkZero
函数由于缺少调用而无法按预期执行。
我意识到的另一件事是,与使用if ... then ... else ...
语句相比,有时更易于执行模式匹配。
这是我想出的有效代码(如果代码中有任何错误,请随时告诉我):
let prime : int -> bool
= fun x ->
match x with
0 -> false
| 1 -> false
| _ -> let a = (x - 1) in
let rec checkZero a x =
if (a > 1) then
match x mod a with
0 -> false
| _ -> checkZero (a - 1) x
else
true
in
checkZero a x
;;
不使用条件语句的等效版本是:
let prime : int -> bool
= fun n ->
match n with
0 -> false
| 1 -> false
| _ -> let a = (n - 1) in
let rec checkZero a n =
match a with
1 -> true
| _ -> match n mod a with
0 -> false
| _ -> checkZero (a - 1) n
in
checkZero a n
;;
答案 1 :(得分:0)
为便于将来参考,这是一个更简单的功能,其功能与您相同(没有优化,但更短):
let prime n =
let rec checkZero x d = match d with
| 1 -> true
| _ -> (x mod d <> 0) && checkZero x (d-1)
in match n with
| 0 | 1 -> false
| _ -> checkZero n (n-1) ;;