它是素数 - 警告匹配案例未使用,返回true而不是false

JIJ*_*JJH 1 ocaml pattern-matching

我试图在OCaml中创建一个函数,该函数表示数字a是否为素数.

这是功能:

let isprime a b = 
  match b with 
   a -> true
  |_ -> if a mod b = 0 then false else isprime (a)(b+1);;
Run Code Online (Sandbox Code Playgroud)

当我跑:isprime (4)(2);;它说我true,但我不明白为什么,因为在这种情况下4 mod 2 = 0,因此它应该返回false...

gle*_*nsl 5

使用标识符作为模式时,您将匹配的值绑定到该标识符.同

match b with
| a -> true
Run Code Online (Sandbox Code Playgroud)

相反的比较ba,你要创建一个新的局部变量a和分配给它的价值b.这将永远成功,因此关于_分支未被使用的警告.

我建议只使用if/else:

let rec isprime a b = 
  if a = b then
    true
  else if a mod b = 0 then
    false
  else
    isprime a (b+1)
Run Code Online (Sandbox Code Playgroud)

编辑:或者你可以做

let rec isprime a b = 
  match () with
  | _ when a = b -> true
  | _ when a mod b = 0 -> false
  | _ -> isprime a (b+1)
Run Code Online (Sandbox Code Playgroud)

但由于这不会进行任何实际的模式匹配,因此会if/else传达您正在做得更好的事情.

注意:您也错过了rec我在上面添加的关键字.

  • **模式** - 匹配检测数据结构中的**模式**.在这里,您只考虑值,因此模式匹配不是正确的工具. (2认同)