пока смотрел на "возможно результат, а возможно и ошибка" и на коллекцию как на две монады, которые надо коммутировать, то, блин, вечно какая-то нескладуха была, ошибки летели в логи, потому что некуда сложить, и т.п.
Как добавил traverse в класс Result, и осознал, что коллекция (в частности) - это traversable, так и всё элементарно стало.
Объект содержит коллекцию, и получен путём парсинга какого-то текста, в котором тоже есть коллекции внутре, и т.п. Результат - или хороший объект, или список дефектов.
Ну так это траверс, и все дела. Апликативный функтор применяется к траверсаблу.
Хоть переписывай свой доклад про апликативы.
E.g.
/*val result=*/ parsed flatMap (_.parsedItems)
What happens here:
parsed
may be a good result with a value inside, or a list of errors; then we call parsedItems on a good value, which can result in a list of errors or in a good value.
Another example:
val eobWithItemsOpt = eobOpt <*> itemsOpt
We have two values each of which can be a list of errors or a good value; if both are good, we return a
Good((eob, items))
, otherwise we produce a summary list of errors.
Obvious? Sure? Cool! Ask...