我有以下代码:
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 :(得分: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
它会编译。但它会无限循环,因为在开始时定义为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
请注意,通过使用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
这是一种真正正确的工作方式。如果你想做FP,不惜一切代价避免使用while循环。