2017-01-17 17 views
0

Я использую Memo из scalaz на некоторое время, однако, здесь ситуация, что я чувствую, я не могу оставаться pure:.Функциональный дизайн программирование: Дело о Memo в scalaz

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

Ваш вопрос может быть похож на этот: Pimping scalaz Memo

Вы найдете решение вашей проблемы там я думаю, но у меня есть что-то больше, чтобы сказать о TrieMap (структуре, предложенной в связанном вопросе). Он хорошо масштабируется с количеством потоков (горизонтальное масштабирование очень хорошее), но оно имеет довольно большую постоянную стоимость операций.

 Смежные вопросы

  • Нет связанных вопросов^_^