Функция traverse
в Scalaz обобщает вашу проблему здесь.Он принимает два аргумента:
T[F[A]]
A => F[B]
и возвращает F[T[B]]
.T
- это любая перемещаемая структура данных, такая как List
, а F
- любой аппликативный функтор, такой как Option
.Поэтому, чтобы специализироваться, ваша желаемая функция имеет такой тип:
List[Option[A]] => (A => Option[B]) => Option[List[B]]
Поэтому поместите все ваши Option
значения в List
val z = List(xMaybe, yMaybe)
Создайте полученную функцию, однако вы хотите собрать результаты:
- val f: X => Option [Y] =...
и вызов traverse
Этот шаблон программирования встречается очень часто.В нем есть статья, в которой все сказано, Суть шаблона итератора .
Примечание: я просто хотел исправить URL, но справка по редактированию CLEVER говорит мне, что мне нужно изменить вминимум 6 символов, поэтому я тоже включил эту полезную ссылку (примеры scala):
http://etorreborre.blogspot.com/2011/06/essence-of-iterator-pattern.html