Предположим, у меня есть два типа:
case class X(i: Int)
case class Y(j: Int)
И X
s представляют некоторую агрегацию Y
s (но я потерял информацию относительно того, какие именно Y
s составили данноеX
).Я хочу вычислить некоторую действительную агрегацию:
def aggregate(xs: List[X], ys: List[Y]): Map[X, List[Y]] = {
require(xs.nonEmpty)
require(ys.nonEmpty)
require(xs.count <= ys.count)
require(xs.map(_.i).sum == ys.map(_.j).sum)
lazy val result: List[X, List[Y]] = sys.error("todo: implement me!")
assert(result forall { case (x, ys) => x.i == ys.map(_.j).sum })
//assume an assertion that each input x and y appears exactly once in the result
result
}
Очевидно, что в общем случае это невозможно;например, здесь не может быть действительного результата:
aggregate(List(X(1), X(3)), List(Y(2), Y(2))
Но для моего случая использования я знаю, что мой метод не может быть вызван с неагрегируемыми значениями.
РЕДАКТИРОВАТЬ : Я собираюсь добавить объяснение того, что на самом деле происходит.По сути, у меня есть два источника сделок, один из которых может быть агрегирован произвольно.То есть, из одного источника я мог бы видеть 2 сделки, каждая из которых имеет количество 1, тогда как из другого источника я мог видеть только одну сделку с количеством 2. Я пытаюсь связать источники сделок, чтобыВ результате Map
говорит, что «эта совокупная сделка 2 фактически состояла из двух сделок 1»