2013-04-10

juan_gandhi: (VP)
2013-04-10 02:01 pm

это всё, конечно, очевидно, но...

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

Как добавил 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...