Я пытаюсь создать композиционный механизм дозирования.
Поток процесса должен быть.
- Накапливать состояние в виде
s: Map[BatchFragmentId, FragmentRequest]
- Вычислите результат в форме
Map[BatchFragmentId, FragmentResponse]
- Выполните серию заранее определенных вычислений, которые имеют форму
f: Map[BatchFragmentId, FragmentResponse] => R
для некоторого результата R.
Мое решение
Пусть Batch[R]
будет монада, которая содержит некоторое накопленное состояние s
и некоторую функцию f
.
map[B](g: R => B)
имеет смысл, так как это просто состав автономных функция f
(Batch.make(f=f.andThen(g), s=s)
.
flatMap[B](f: R => Batch[B])
на руке не имеет особого смысла, так как R
требует завершения вычислений, поэтому Batch[B]
не может существовать в этой точке, поскольку s
должен содержать состояние Batch[B]
при выполнении вычисления ответа.
Изменение flatMap
:
def combine[B, C](that: Batch[B])(t: (A, B) => C): Batch[C] = {
val combined: Map[BatchFragmentId, FragmentRequest] = that.state ++ state
val g: Map[BatchFragmentId, FragmentResponse] => C =
(r: Map[BatchFragmentId, FragmentResponse]) => t(f(r), that.f(r))
Batch.make(combined, g)
}
Это плохо работает с Scala для понимания и его читабельность ухудшается быстрее, чем для понимания.
val b: Batch[String] = ???
val b2: Batch[String] = ???
val b3: Batch[Int] = ???
val combined: Batch[(String, String)] =
(b.combine(b2){ case (s1, s2) => s1 + s2 })
.combine(b3){ case (s1, i1) => s1 + i1.toString }
Что может стать очень запутанным при использовании пары пакетов. Желательный способ составить эти пакеты:
val o: Batch[(String, String)] = for {
_ <- put("key", "42")
x1 <- get("key")
_ <- put("key2", "24")
x2 <- get("key2")
} yield (x1, x2)
Но любой элегантный синтаксис будет решением.
Я не так хорошо разбираюсь в теории категорий и имею ограниченный опыт работы с писать код в этой форме, поэтому я не уверен, какие классы типов следует искать для этой конкретной проблемы.
Это даже правильный подход для такой проблемы; правильно ли я моделирую проблему? Эта проблема уже хорошо изучена и обобщена?
В моем распоряжении также есть кошки.