Не то чтобы я снова грохнул по тому же барабану, но ...
Решение проблемы, когда у нас есть ряд процессов, которые могут привести к успешному выводу или завершиться с ошибкой с каким-либо сообщением об ошибке.Цель состоит в том, чтобы агрегировать успешные результаты, если все процессы приводят к успеху, и если один или несколько сбоев, агрегировать все сообщения об ошибках.
Это может быть решено с помощью scalaz проверка: во-первых, настройте некоторые операции импорта
scala> import scalaz._; import Scalaz._
import scalaz._
import Scalaz._
Теперь давайте определим наши "процессы"
scala> def fooI(s : String) : ValidationNEL[Exception, Int] = s.parseInt.liftFailNel
fooI: (s: String)scalaz.Scalaz.ValidationNEL[Exception,Int]
scala> def fooF(s : String) : ValidationNEL[Exception, Float] = s.parseFloat.liftFailNel
fooF: (s: String)scalaz.Scalaz.ValidationNEL[Exception,Float]
scala> def fooB(s : String) : ValidationNEL[Exception, Boolean] = s.parseBoolean.liftFailNel
fooB: (s: String)scalaz.Scalaz.ValidationNEL[Exception,Boolean]
Теперь используем Applicative
для объединения неудач / успехов:
scala> def attempt(ss : String*) = (fooI(ss(0)) <|**|> (fooF(ss(1)), fooB(ss(2)))) match {
| case Success((i, f, b)) => println("Found " + i + " " + f + " " + b)
| case Failure(es) => es foreach println
| }
attempt: (ss: String*)Unit
Теперь давайте попробуем на несколько сбоев:
scala> attempt("a", "b", "true")
java.lang.NumberFormatException: For input string: "a"
java.lang.NumberFormatException: For input string: "b"
Теперь попробуем на успех:
scala> attempt("1", "2.3", "false")
Found 1 2.3 false