Pimping scalaz备忘录

时间:2013-03-06 03:20:16

标签: scala scalaz memo

我喜欢新的scalaz Memo功能,但发现它缺少两件事:1)它隐藏了我需要访问的底层Map - 至少是所有值的List,以及2)我想要一个已实现的版本使用val scala.collection.concurrent.TrieMap,我在某处读取比var map更好。

我还不是一个隐含的巫师。有没有办法让这个Memo类加入支持这个功能的版本,或者我将不得不剪切/粘贴到一个独特的新类中?

1 个答案:

答案 0 :(得分:3)

这可以使用内置的Memo.memo功能完成。 Memo.memo从函数F =>创建一个Memo实例。 K => V.这也可以让您轻松访问底层特里。例如:

scala> def trieMemo[A, B](trie: collection.concurrent.TrieMap[A, B]) = 
         Memo.memo[A, B](f => k => trie.getOrElseUpdate(k, f(k)))
trieMemo: [A, B](trie: scala.collection.concurrent.TrieMap[A,B])scalaz.Memo[A,B]

scala> val trie = collection.concurrent.TrieMap[Int, Int]()
trie: scala.collection.concurrent.TrieMap[Int,Int] = TrieMap()

scala> val f = trieMemo(trie)(n => n * n)
f: Int => Int = <function1>

scala> f(5)
res0: Int = 25

scala> f(10)
res1: Int = 100

scala> trie
res2: scala.collection.concurrent.TrieMap[Int,Int] = TrieMap(5 -> 25, 10 -> 100)