通过返回一些东西来停止功能

时间:2018-06-13 08:57:34

标签: ocaml

我目前正在尝试创建一个函数,说明数字是否为素数。

以下是我所做的:

let is_prime k = 
    for i = 2 to (k-1) do
        if k mod i = 0 then print_string "Not prime"
    done;
    print_string "Prime"

您可能已经注意到问题是当我打印Not prime时,它不会停止该功能。

我想知道是否有办法停止该功能,例如在打印后立即返回()" Not prime"。

我知道通过模式匹配它会返回一些内容并停止该功能,但我的问题是针对我们没有使用模式匹配的情况。

也许像return这样的关键字与其他编程语言一样?

此外,如果我希望我的函数返回truefalse,我就无法执行以下操作:

let is_prime k = 
    for i = 2 to (k-1) do
        if k mod i = 0 then false
    done;
    true

它根本不起作用。

1 个答案:

答案 0 :(得分:2)

我觉得它能回答你的问题。如果你使用异常来打破循环,那么你可以接管并做任何你想做的事情:

let is_prime k =
  try
    for i = 2 to (k-1) do
      if k mod i = 0 then raise Exit
    done;
    print_string "Prime"
  with Exit -> print_string "Not prime"

您甚至可以返回boolean

let is_prime k =
  try
    for i = 2 to (k-1) do
      if k mod i = 0 then raise Exit
    done;
    print_string "Prime";
    true
  with Exit ->
    print_string "Not prime";
    false

根据ChrisVine的建议编辑

以下是一种更为惯用的方法,可以在不使用模式识别的情况下执行您想要的操作:

let is_prime k =
  let rec is_prime' i k =
    if i < k - 1
    then
      if k mod i = 0
      then print_string "Not prime"
      else is_prime' (i + 1) k
    else
      print_string "Prime";
in
is_prime' 2 k

但请注意,使用模式识别的vonaka解决方案是首选方式。