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此处的值但是,while true do .. doneOCaml中仍然存在一个循环。希望您对我在这里要做的事情有所了解。如何修改代码以完成此工作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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章