【发布时间】:2012-02-03 01:20:07
【问题描述】:
我在 ocaml 中有一个递归的不可变数据结构,可以简化为这样的:
type expr =
{
eexpr : expr_expr;
some_other_complex_field : a_complex_type;
}
and expr_expr =
| TInt of int
| TSum of (expr * expr)
| TMul of (expr * expr)
这是一个 AST,有时它会变得非常复杂(非常深)。
有一个计算表达式的递归函数。例如,假设,
let rec result expr =
match expr.eexpr with
| TInt i -> i
| TSum (e1, e2) -> result e1 + result e2
| TMul (e1, e2) -> result e1 * result e2
现在假设我正在将一个表达式映射到另一个表达式,并且我需要不断检查 expr 的结果,有时对同一个 expr 进行多次检查,有时对最近使用该模式映射的表达式进行检查
{ someExpr with eexpr = TSum(someExpr, otherExpr) }
现在,结果函数非常轻量级,但多次运行深度 AST 并不会得到很好的优化。我知道我可以使用 Hashtbl 缓存值,但 AFAIK Hashtbl 只会做结构相等,所以无论如何它都需要遍历我的长 AST。 我知道最好的选择是在 expr 类型中包含一个可能不可变的“结果”字段。但我做不到。
那么在 Ocaml 中是否有任何方法可以将值缓存到不可变类型,这样我就不必每次需要时都急切地计算它?
谢谢!
【问题讨论】:
标签: caching hashtable ocaml immutability