OCaml的同时,真正做循环

OCaml的同时,真正做循环

问题描述:

我有以下代码:OCaml的同时,真正做循环

let a = 1 in 
while a<10 do 
    let a = a+1 in 
done 
Printf.printf "the number is now %d\n" a 

的解释抱怨线4条,这是done,我不知道什么是错在这里。
我知道OCaml是一种功能性语言,变量是不可变的。我不应该在这里尝试改变a的值。 但是,OCaml中仍有一个while true do .. done循环。我希望你能明白我在这里要做的事情。我应该如何修改代码才能使用while true do .. done来完成这项工作?
我对函数式编程非常陌生。请教我正确的方式开始使用它。我发现自己陷入了必然的思考僵局。

+0

你看过OCaml [标签](http://*.com/tags/ocaml/info)吗?特别是本书[“Real World OCaml”](https://realworldocaml.org/) –

+0

您必须按照上面的建议学习Real World Ocaml。函数式编程与Java等命令式编程大不相同。 –

+0

我会看看这些书。感谢您的帮助! – Ra1nWarden

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 

它将编译。但它会无限循环,因为a在开始时定义为1而不是声明为+1。 两者在不同的范围上都是不同的值,一段时间内的声明仅限于身体的发生。

你可以得到你想要的东西通过裁判的功能和它的处理程序指定为可变:

let a = ref 1 in 
while !a < 10 do 
a := !a + 1 
done 
Printf.printf "the number is now %d\n" !a 

请注意,您通过使用while循环和可变的价值观失去FP的所有优点。

要做到这一点的functionnal的方式,你可以使用一个递归函数:

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 

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