我想编写Ocaml函数,它接受两个参数:其他函数(int-> int)和int值,然后以某种方式检查它是否与之前的参数一起使用。怎么做?
所以查看该问题的另一种方法是如何使用可变的标识来识别函数?
问题是:使函数g取函数f和int值n,而不是检查g是否已用于f为该值n,如果是,则返回先前得到的结果,否则将f计为n值。 f是int-> int
答案 0 :(得分:1)
你需要改变你的想法:不要单独保留函数f
和g
,而是g
将f
转换为自己的记忆版本:
module IntMap = Map.Make (struct type t = int let compare a b = a - b end)
let g f =
let m = ref (IntMap.empty) in
fun x ->
try IntMap.find x !m
with Not_found ->
let r = f x in
m := IntMap.add x r !m;
r
显然值得做基准测试,看看计算的成本是否比记忆的成本更差。此外,最好使用Hashtbl
代替Map
(左侧作为练习)。