我有以下代码:
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
此处的值。但是,while true do .. done
OCaml中仍然存在一个循环。希望您对我在这里要做的事情有所了解。如何修改代码以完成此工作while true do .. done
?
我对函数式编程非常陌生。请教我正确的入门方法。我发现自己陷入了当务之急的僵局。
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与声明为a + 1的a不同。两者在不同的范围内都是不变的,不同的值,并且一会儿在体内的声明仅限于该体内的出现。
您可以通过使用ref函数及其处理程序将其指定为可变对象来获得所需的内容:
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循环。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句