Одно распространённое применение этой магии - .sequenceU.
У нас есть список строк, в которых должен быть JSON:
val jsonStrings: List[String] = ???
Мы хотим спарсить это в scalaz Validation[String, JSON] (аналог Either) функиией parse:
def parse(jsonString: String): Validation[String, JSON] = ???
val validJsons: List[Validation[String, JSON]] =
jsonStrings.map(parse)
Теперь мы лёгким движением руки можем превратить этот список валидаций в список JSON'ов (при условии что ВСЕ они были валидными)!
validJsons.sequenceU // Validation[String, List[JSON]]
И работать с правой частью не думаю о возможной ошибке, используя flatMap или аппликативный билдер. Это безумно удобно, особенно если подсесть на Validation[NonEmptyList, _].
Фишка в том что если наша функция parse выдаёт Option[JSON] (или любую другую "монадическую" структуру с одной дыркой, например Future[JSON]), то мы используем .sequence (без U), а для Dijsunction, Validation etc мы обязаны были использовать .sequenceU и для этого типа данных должен был быть определён класс типа Unapply (от определения которого глаза на лоб лезут
https://github.com/scalaz/scalaz/blob/v7.1.3/core/src/main/scala/scalaz/Unapply.scala#L134-L144 и который не понимает Intellij IDEA и подсвечивает всю функцию красным) Теперь этот хак уйдёт в прошлое (хотя, даже если будет включен в 2.12 ждать нужно будет ещё не год и не два). Возможно не самое критичное проявление бага, но я пишу .sequenceU почти каждый день так что самое частое для меня