gpt4 book ai didi

functional-programming - OCaml 中 let rec 的限制

转载 作者:行者123 更新时间:2023-12-04 06:03:38 27 4
gpt4 key购买 nike

这些天我正在学习 OCaml 并遇到了这个问题:

OCaml 对它可以放在 let rec 右侧的内容有限制。像这个

let memo_rec f_norec =
let rec f = memoize (fun x -> f_norec f x) in
f;;
Error: This kind of expression is not allowed as right-hand side of `let rec'

其中,memoize 是一个函数,它接受一个函数并将其转换为带有 Hashtable 的内存版本。很明显,OCaml 对“let rec”右侧结构的使用有一些限制,但我真的不明白,有人能解释一下吗?

最佳答案

您可以使用打结技术来定义内存固定点。例如,参见这两个等效定义:

let fix_memo f =
let rec g = {contents = fixpoint}
and fixpoint x = f !g x in
g := memoize !g;
!g

let fix_memo f =
let g = ref (fun _ -> assert false) in
g := memoize (fun x -> f !g x);
!g

或使用 lazy正如阿兰提醒的那样:
let fix_memo f =
let rec fix = lazy (memoize (fun x -> f (Lazy.force fix) x)) in
Lazy.force fix

关于functional-programming - OCaml 中 let rec 的限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19859953/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com