繁体   English   中英

OCaml中的递归函数引用?

[英]Recursive function references in OCaml?

今天我们在SML中学到了“打结”,你有类似的东西

val tempFunc = ref (fn k:int => true);
fun even x = if x = 0 then true else !tempFunc(x-1);
fun odd x = if x = 0 then false else even(x-1);
tempFunc := odd;

而我正在使用类似的ocaml,但我只是在做同样的事情。 我发现的最接近的是

let tempFunc {contents =x}=x;;

但我真的不明白,以及如何将tempFunc绑定到另一个函数。 任何帮助表示赞赏!

您在OCaml中直接翻译的代码是:

let tempFunc = ref (fun k -> true)
let even x = if x = 0 then true else !tempFunc (x-1)
let odd x = if x = 0 then false else even (x-1)
let () = tempFunc := odd

执行此操作的惯用方法(就像在SML中一样)是使用递归函数:

let rec even x = if x = 0 then true  else odd  (x-1)
and     odd  x = if x = 0 then false else even (x-1)

等效的OCaml代码是

let tempFunc = ref (fun (k: int) -> true);;

let even x = if x = 0 then true else !tempFunc (x-1);;

let odd x = if x = 0 then false else even (x-1);;

tempFunc := odd;;

如你所说,它几乎与SML代码完全相同。

(编辑补充:实际上,托马斯的代码有点漂亮!)

有另一种方法可以在不使用引用的情况下使用相同的东西:

let rec even_helper f x = if x = 0 then true else f even_helper (x-1);;
let rec odd_helper f x = if x = 0 then false else f odd_helper (x-1);;
let even = even_helper odd_helper;;
let odd = odd_helper even_helper;;

请注意,此代码涉及无人看守的递归类型:帮助器的类型是('a -> int -> bool) -> int -> bool as 'a ,这意味着帮助器的第一个参数是一个函数,其第一个参数是帮助者。 Ocaml接受此类型,但仅当您将-rectypes选项传递给编译器时。

使用更多功能,您可以完全取消rec 这不是你问题的直接答案,而是一个侧面轨道,展示了这种模式如何以纯粹的功能方式呈现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM