OCaml程序确定素数

时间:2018-09-17 11:54:42

标签: syntax-error ocaml

我正在尝试使用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的工作方式,但是我确实知道当您希望整个代码成为表达式时会使用双分号。  不过,我不太确定是什么导致了错误。

任何反馈都值得赞赏。谢谢!

2 个答案:

答案 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) ;;