2016-01-03 2 views
2

Мне нужен комбинатор, который flatMap дизъюнкции (\/) с ValidationNel.flatMap дизъюнкция с ValidationNel

Вот моя попытка:

def flatMap[A, B, C](d: \/[A, B], f: B => ValidationNel[A, C]) : ValidationNel[A, C] = 
    d.leftMap(_.wrapNel).flatMap(f(_).disjunction).validation 

Есть ли более элегантное решение?

ответ

2

я только раз за дизъюнкцию в этом случае, это более кратким и создает меньше промежуточных значений:

import scalaz._, Scalaz._ 

def flatMap[A, B, C](
    d: \/[A, B], 
    f: B => ValidationNel[A, C] 
): ValidationNel[A, C] = d.fold(_.failureNel[C], f) 

Вы также можете импортировать Validation.FlatMap._, а затем использовать d.validationNel.flatMap(f), но я бы не рекомендовал его. Мне нравится тот факт, что у Cats есть метод andThen по его типу проверки, который похож на flatMap, но без названия сахара-я хочу, чтобы у Scalaz было что-то сравнимое.

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