2013-03-06 61 views
2

我喜欢新的斯卡拉备忘录功能,但发现它缺少两件事:1)它隐藏了我需要访问的底层地图 - 至少包含所有值的列表,以及2)我想要一个那是使用VAL scala.collection.concurrent.TrieMap,这是我读的地方实现版本比一个变种地图理想。Pimping scalaz备忘录

我还没有一个隐含的向导。有没有办法皮条客这个备忘录类添加支持该功能还是我将不得不剪切/粘贴到一个不同的,新的类版本?

+1

你可以添加一个补丁。你为什么需要基础价值? – 2013-03-06 04:16:02

+0

正如一个考虑:是不是会违背备忘录这个概念,这应该是隐藏使用记忆的实现细节? – 2013-03-06 08:23:04

回答

2

这可以通过内置的Memo.memo函数来完成。 Memo.memo从函数F => K => V创建一个Memo实例。这也使您可以轻松访问底层的trie。例如:

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)