2013-03-06 2 views
2

Мне нравится новая функциональность Memaz Memo, но не хватает двух вещей: 1) она скрывает базовую карту, к которой мне нужен доступ - по крайней мере, список всех значений, и 2) я хочу которая реализована с использованием val scala.collection.concurrent.TrieMap, который я где-то читал, предпочтительнее, чем var Map.Pimping scalaz Memo

Я еще не скрытый мастер. Есть ли способ сутенерствовать этот класс Memo, чтобы добавить версии, поддерживающие эту возможность, или мне придется вырезать/вставить отдельный класс?

+1

Вы можете добавить патч. Зачем вам базовые ценности? –

+0

Как раз соображение: не было бы это против самой концепции Memo, которая должна заключаться в том, чтобы скрыть детали реализации от использования memoization? –

ответ

2

Это может быть выполнено с помощью встроенной функции Memo.memo. Memo.memo создает экземпляр Memo из функции F => K => V. Это также позволяет легко получить доступ к базовому 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)