2

私は新しい scalaz Memo 機能が気に入っていますが、2 つの点が欠けていることに気付きました: 1) アクセスが必要な基礎となる Map を非表示にします -- 少なくともすべての値のリスト。2) val を使用して実装されたバージョンが必要です。私がどこかで読んだscala.collection.concurrent.TrieMapは、varマップよりも好ましいです。

私はまだ暗黙の魔法使いではありません。この機能をサポートするバージョンを追加するために、この Memo クラスをポンピングする方法はありますか?それとも、別の新しいクラスにカット/ペーストする必要がありますか?

4

1 に答える 1

3

これは、組み込みの Memo.memo 関数で実現できます。Memo.memo は、関数 F => K => V から Memo インスタンスを作成します。これにより、基になるトライに簡単にアクセスすることもできます。例えば:

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)
于 2013-03-07T02:37:47.407 に答える