2012-08-29 25 views
8

deJosh Suereth de "Scala de Profundidad":¿Cómo se relacionan los funcionadores aplicativos con los algoritmos de paralelización? (Scala y Scalaz)

"funtores aplicativos proporcionan una manera de tomar dos cálculos y unirlos mediante una función El ejemplo de Traversable pone de relieve cómo dos colecciones pueden ser paralelizados en parejas. Los funtores aplicativos y el procesamiento paralelo van de la mano, como pan y mantequilla ".

Tengo una vaga idea de todo functors/mónadas/material aplicativo, pero no exactamente una buena comprensión de eso (nuevo para toda la mónada, functor). Comprendo un poco el concepto de mónadas (flatten, flatMap) y flujo de trabajo monádico, y funtores (mapas).

¿Alguien puede explicarme en términos de cómo se hace, ejemplos y/o beneficios de la paralelización "tradicional"?

+0

Tengo un ejemplo en [mis diapositivas] (https://docs.google.com/presentation/d/1iiTmrGkc7lZHcrgQOQ1xfro82BvFOqoVSnhH-HdWPx4/present#slide=id.p) –

Respuesta

12

Le envié la pregunta a Josh Suereth. Esta es su respuesta:

Mike -

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)

+0

Probé el mapa (processX, processY, processZ) {(x, y, z) => ...} pero no compila para mí.¿Es una característica de scalaz7 tener esta asignación de TupleX [Validación, ...]? –

+0

No creo que Josh se estuviera refiriendo a Scalaz en absoluto. Lo señalaré a este hilo. –

+1

Sí, mi publicación es más básica, no específica de Scalaz. Estaba usando la sintaxis de aplicación de SBT con los conceptos en Scalaz. Aquí hay una introducción decente: https://github.com/bartschuller/scalaz-validation-example – jsuereth

Cuestiones relacionadas