2012-08-29 20 views
8

喬什Suereth的「斯卡拉縱深」:應用函子如何配合並行化算法? (Scala和Scalaz)

「應用型仿函數提供一種方式來採取兩種計算和使用功能,它們連接在一起的可通過示例突出兩個集合如何可以並行入對。 。應用函子和並行處理就像麪包和黃油一樣。「我對整個仿函數/ monads /應用的東西有一個模糊的想法,但並不完全掌握它(新的整個monad,函數的東西)。我理解monads(flatten,flatMap)和monadic工作流以及函子(地圖)的概念。

任何人都可以請我詳細說明它是如何完成的,例子和/或它與「傳統」並行化的好處?

+0

我在[我的幻燈片]中有一個示例(https://docs.google.com/presentation/d/1iiTmrGkc7lZHcrgQOQ1xfro82BvFOqoVSnhH-HdWPx4/present#slide=id.p) –

回答

12

我把這個問題轉發給喬希蘇勒斯。這是他的回答:

邁克 -

我沒有很多時間迴應,但我會提供給我的意思的 例子:

示例#1 - 表單驗證。

我想運行對輸入一些驗證和骨料所有的 錯誤,即發現它們在並行。通過應用功能,I 可以這樣做。

因此,給定一組的「處理」功能,像這樣:

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 
    } 

現在處理的形式將打印出與信用卡式/用戶名+ 地址的所有錯誤,在同一時間,因爲你已經合併他們使用 應用仿函數。這是並行錯誤報告(儘管 測試並非實際並行執行)。

(2)期貨

我想要做並行的幾件事情和結果相結合。未來的 「zip」方法實際上是一個僞裝的應用函子。我能做到這 :

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

我只是用應用型函子以「加盟」並行計算。
它與Form驗證示例完全相同。

希望幫助! - 喬希

(注意,這些代碼片段都是非編譯的例子,我用SBT的應用性語法與Scalaz的概念,所以你需要選擇一個庫使用applicatives和他們申請到什麼)

+0

我試過(processX,processY,processZ)地圖{(x,y,z)=> ...}但它不適合我。這是TualaX [Validation,...]的這種映射的scalaz7功能嗎? –

+0

我不認爲Josh是指scalaz。我會把他指向這個線程。 –

+1

是的,我的文章是更基本的,不是特定於斯卡拉茲。我在斯卡拉斯的概念中使用了SBT的應用語法。這是一個體面的介紹:https://github.com/bartschuller/scalaz-validation-example – jsuereth