我一直在使用scalaz中的Memo
一段时间,但是,我认为这种情况无法保持pure
。:
def compute(a: Int, b: Int): Int = {a+b} //an expensive computation
val cache = Memo.immutableHashMapMemo[(Int, Int), Int]{
case ((a,b)) => compute(a,b)
}
现在,我在s1
类型中都有s2
和Set[(Int, Int)]
。例如,s1 = Set((1,1), (1,2))
和s2 = Set((1,2), (1,3))
。每个列表必须并行运行:
def computePar(s: Set[(Int, Int)]): Set[Int] = //using compute() in parallel
所以问题是每次我只能从输入列表中获取结果列表。虽然我的Memo
仍应为Map[(Int, Int), Int]
,因为您可以将compute(1,2)
s1
重新用于s2
中的第一个元素。使用可变映射应该可以解决问题。我只是想知道是否有FP解决方案。我觉得它可能与Kleisli
或类似相关。
答案 0 :(得分:0)
您的问题可能类似于以下问题:Pimping scalaz Memo
我认为你会找到解决问题的方法,但我还有更多关于TrieMap的说法(链接问题中提出的结构)。它可以很好地扩展螺纹数量(水平缩放非常好),但它具有相当大的恒定操作成本。