2012-08-29 12 views
8

:Uygulama amaçlı functor'lar, paralelleştirme algoritmaları ile nasıl bağlanır? (Scala ve Scalaz) Josh Suereth yönettiği "Scala Derinlik" Kimden

"Uygulanabilir fanktorlar iki hesaplamaları alıp bir fonksiyonu kullanarak bunları birlikte katılmak için bir yol sağlar Traversable örnek, iki koleksiyon çiftler halinde paralelleştirilebilir nasıl vurgulamaktadır. Uygulamalı frezeler ve paralel işlem ekmek ve tereyağı gibi bir araya geliyor. "

Tüm robot/monad/uygulamalı şeyler hakkında belirsiz bir fikrim var ama tam olarak güçlü bir kavrayışı değil (tüm monad, functor şeyleri için yeni). Monad kavramını (flatten, flatMap) ve monadic iş akışını ve functor'ları (haritalar) biraz anlıyorum.

"Geleneksel" paralelleştirmeye karşı nasıl yapıldığının, örneklerinin ve/veya yararlarının ne olduğu konusunda bana göre herhangi bir kişi lütfen bana yardımcı olabilir mi?

+0

[Slaytlarım] içinde bir örneğim var (https://docs.google.com/presentation/d/1iiTmrGkc7lZHcrgQOQ1xfro82BvFOqoVSnhH-HdWPx4/present#slide=id.p) –

cevap

12

Soruyu Josh Suereth'e ilettim. -

ben cevap çok zaman yok, ama ne demek istediğimi dair örneklerin sunarız

Mike: Bu onun Cevap

Örnek # 1 - Form Doğrulama.

ben yani bazı girdisine karşı doğrulamayı ve agrega tüm hataları çalıştırmak paralel bunları algılamak istiyorum. Uygulama fonksiyonları ile I bunu yapabilir.

Yani, "işleme" işlevleri, bir dizi şöyle verilen:

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 
    } 

Şimdi kombine beri formu aynı anda CreditCard/kullanıcı adı + adresi ile tüm hataları yazdırır işlemek Bir uygulama functor kullanarak. Bu paralel hata raporlaması ( testi aslında paralel olarak yapılmamaktadır).

(2) Vadeli

ben paralel olarak bir şeyler yapmak ve sonuçlarını birleştirmek istiyorum. Geleceğin "zip" yöntemi, aslında gizlemede uygulamalı bir functor. Ben bunu yapabilirsiniz:

Future(computation1) zip Future(computation2) map { case (one,two) => .... } 

Sadece paralel hesaplamalar "katılmak" için Uygulanabilir functors kullandım.
Tam olarak Form doğrulama örneği ile aynıdır.

Bu yardımcı olur umarım! - Josh

(bu kod parçacıkları olmayan derlenebilir örneklerdir not; ben Scalaz içinde kavramlarla SBT en uygulamalı sözdizimi kullanıyordu, onların üzerine başvuran hangi applicatives kullanması ve bir kütüphane seçmeniz gerekir böylece)

+0

(processX, processY, processZ) haritasını denedim {(x, y, z) => ...} ama benim için derleme yapmıyor.TupleX [Validation, ...] ile eşleşmesi için scalaz7'nin bir özelliği midir? –

+0

Bence Josh scalazdan bahsediyordu. Onu bu konuya yönlendireceğim. –

+1

Evet, yazım daha basit, Scalaz'a özgü değil. SBT'nin Scalaz'daki kavramlarla uygulamalı sözdizimini kullanıyordum. İşte iyi bir tanıtım: https://github.com/bartschuller/scalaz-validation-example – jsuereth