2013-03-06 11 views
2

새로운 스카 라 메모 기능이 마음에 들지만 2 가지가 부족하다는 것을 알았습니다. 1) 기본지도를 숨 깁니다. 액세스가 필요합니다. - 최소한 모든 값 목록과 2) scala.collection.concurrent.TrieMap을 사용하여 구현 된 버전입니다. 어딘가에 읽으면 var 맵보다 좋습니다.Pimping scalaz 메모

아직 암시 적 마법사가 아닙니다. 이 메모 클래스에이 기능을 지원하는 버전을 추가 할 방법이 있습니까? 아니면 별개의 새 클래스로 잘라내어 붙여야합니까?

+1

패치를 추가 할 수 있습니다. 기본 가치가 필요한 이유는 무엇입니까? –

+0

메모와 마찬가지로 구현 세부 정보를 메모 작성의 사용으로부터 숨기는 것이 바로 메모 개념에 위배되는 것이 아닌가? –

답변

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)