tiye
1
memoize 函数是常用功能, 我找了点其他语言做参考
Rust 跟 Moonbit 相似度较高, 但 Rust 为了处理不同类型的数据的缓存, 用了 macro 自己去读 token 了. Moonbit 没有 macro, 应该抄不了,
JavaScript 动态类型实际没有限制, 但也有一些对象不方便实现 Eq 的问题, 用了高阶函数暴露参数处理, 类型方面… 只看到 as
… 看上去也不是适合 Moonbit 的方案,
OCaml 的例子找到一个, 不大熟悉, 但看上去不是通用的,
https://cs3110.github.io/textbook/chapters/ds/memoization.html#memoization-using-higher-order-functions
功能上的话, 想要一个通用的 memoize, 如果有一定的定制空间对参数自行做筛选也更好, 想看看有没有同学有实现过, 想抄个用…
pub fn memorized[K : Hash + Eq, V](f: (K) -> V) -> (K) -> V {
let map = @hashmap.new()
fn (k: K) -> V {
match map[k] {
Some(v) => v
None => {
let v = f(k)
map[k] = v
v
}
}
}
}
pub fn memorized2[K1: Hash + Eq, K2 : Hash + Eq, V](f: (K1, K2) -> V) -> (K1, K2) -> V {
let map = @hashmap.new()
fn (k1: K1, k2: K2) -> V {
match map[(k1, k2)] {
Some(v) => v
None => {
let v = f(k1, k2)
map[(k1, k2)] = v
v
}
}
}
}
1 个赞
tiye
3
看上去暂时不能像 macro 或者动态语言那些完全单个 memoize 来处理所有场景了. 暂时这样写还是能先用着的, 感谢.