Не то чтобы я снова бью в тот же барабан, но...
Решение проблемы, когда у нас есть ряд процессов, которые могут дать успешный результат или завершиться ошибкой с некоторым сообщением об ошибке. Цель состоит в том, чтобы агрегировать успешные результаты, если все процессы завершаются успешно, а если один или несколько завершаются неудачно, агрегировать все сообщения об ошибках.
Это можно решить с помощью проверки 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
person
Community
schedule
25.11.2010