函数式编程设计:一个关于scalaz中的Memo的案例

时间:2017-01-17 22:57:14

标签: functional-programming scalaz

我一直在使用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类型中都有s2Set[(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或类似相关。

1 个答案:

答案 0 :(得分:0)

您的问题可能类似于以下问题:Pimping scalaz Memo

我认为你会找到解决问题的方法,但我还有更多关于TrieMap的说法(链接问题中提出的结构)。它可以很好地扩展螺纹数量(水平缩放非常好),但它具有相当大的恒定操作成本。