Le envié la pregunta a Josh Suereth. Esta es su respuesta:
no tengo mucho tiempo para responder, pero voy a ofrecer a los ejemplos de lo que quiero decir:
Ejemplo # 1 - Validación de formulario
Quiero correr contra alguna validación de entrada y el agregado todos los errores, es decir, detectarlos en paralelo . Con funciones aplicativas I puede hacerlo.
Así, dado un conjunto de funciones de "proceso", así:
def processUser(data: Data): Validation[User] = {
if (data get "username" isEmpty) Failure("username must not be empty")
else {
val Some(user) = data get "username"
if (user contains badCharacterRegex) Failure(s"username must not contain one of ${badchars}")
else Success(user)
}
}
def processCreditCard(data: Data): Validation[CreditCard] = ...
def processAddress(data: Data): Validation[Address] = ...
def handleForm(data: Data): ??? = {
(processUser(data), processCreditCard(data), processAddress(data)) map { (user, card, address) =>
postPayment(user, address, card)
} recover { (errors) =>
errors foreach println
}
Ahora manejar forma imprimirá errores con tarjeta de crédito/nombre de usuario + dirección, todo al mismo tiempo, ya que ha combinado ellos usando un funcionador aplicativo . Es un informe de errores en paralelo (aunque las pruebas de no se realizan en paralelo).
(2) Futuros
quiero hacer algunas cosas en paralelo y combinar los resultados. El método de "zip" de Future es en realidad un functor aplicativo disfrazado. Puedo hacer esto :
Future(computation1) zip Future(computation2) map { case (one,two) => .... }
simplemente he utilizado aplicativos Functors a "unirse" cálculos paralelos.
Es exactamente lo mismo que el ejemplo de validación de formulario.
Espero que ayude! - Josh
(tenga en cuenta estos fragmentos de código son ejemplos no compilables; yo estaba usando la sintaxis aplicativo de SBT con los conceptos en Scalaz, por lo que tiene que elegir una biblioteca para usar aplicativos y lo que están aplicando a)
Tengo un ejemplo en [mis diapositivas] (https://docs.google.com/presentation/d/1iiTmrGkc7lZHcrgQOQ1xfro82BvFOqoVSnhH-HdWPx4/present#slide=id.p) –