Не то, чтобы я снова ударяя тот же барабан, но ...
решения для задачи, в которой у нас есть целый ряд процессов, которые могут производить успешный выход, или потерпеть неудачу с некоторым сообщением об ошибке. Цель состоит в том, чтобы агрегировать успешные результаты, если все процессы приводят к успеху и если один или несколько сбоев завершаются, агрегировать все сообщения об ошибках.
Это может быть решена с помощью 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
scalaz: `(Список (1, 2, 3) | @ | Список («a», «b»)) ((_, _)) ` – Debilski 2010-11-25 13:18:44
Или скалаз:` (xs ⊛ ys) {× (_) (_)} `, если дело доходит до этого – 2010-11-25 17:22:28