2013-03-06 93 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)