OCaml虽然是真的循环

Ra1*_*den 2 ocaml functional-programming

我有以下代码:

let a = 1 in
while a<10 do
  let a = a+1 in
done
Printf.printf "the number is now %d\n" a
Run Code Online (Sandbox Code Playgroud)

口译员抱怨第4行,这是done我不知道这里有什么问题.
我知道OCaml是一种函数式语言,变量是不可变的.我不应该试图改变a这里的价值.但是,while true do .. doneOCaml 还有一个循环.我希望你能理解我在这里要做的事情.我该如何修改代码才能完成这项工作while true do .. done
我是函数式编程的新手.请教我正确的方法来开始它.我发现自己陷入了强制思考的僵局.

Pat*_*atJ 8

let ... in构造期望另一个表达式.例如,您可以使用()值(基本上意味着"没有")

所以代码

let a = 1 in
while a<10 do
   let a = a+1 in
   ()
done
Printf.printf "the number is now %d\n" a
Run Code Online (Sandbox Code Playgroud)

它会编译.但它会无限循环,因为在开始时定义为1的a与声明为+ 1的a不同.两者在不同的范围内都是恒定的不同值,并且一段时间内的声明仅限于身体的出现.

您可以通过使用ref函数及其处理程序指定as mutable来获得所需内容:

let a = ref 1 in
while !a < 10 do
 a := !a + 1
done
Printf.printf "the number is now %d\n" !a
Run Code Online (Sandbox Code Playgroud)

请注意,通过使用while循环和可变值,您将失去FP的所有好处.

要以函数方式执行此操作,您可以使用递归函数:

let rec f a =
 if a < 10
 then f (a+1)
 else a
in
let a = f 1 in
Printf.printf "the number is now %d\n" a
Run Code Online (Sandbox Code Playgroud)

这是一个真正正确的工作方式.如果你想做FP,不惜一切代价避免使用while循环.