通用的 memoize 模块怎样实现?

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 个赞

看上去暂时不能像 macro 或者动态语言那些完全单个 memoize 来处理所有场景了. 暂时这样写还是能先用着的, 感谢.