2014-06-10 32 views
4

播放Framework的(2.X)Form class有一個名爲fold方法誰的用法表示爲:玩框架表「倍」的方法命名理由

anyForm.bindFromRequest().fold(
    f => redisplayForm(f), 
    t => handleValidFormSubmission(t) 
) 

從本質上講,第一個函數參數是什麼大幹快上結合執行失敗,並在綁定成功的第二。對我來說,它似乎類似於jQuery的ajax函數的'成功'和'錯誤'回調。

我的問題是爲什麼Play開發人員稱這種方法爲「摺疊」?作爲一個免責聲明,我是Scala的新手,但是我無法看到它和Scala的功能之間的聯繫。唯一的相似之處在於它是一個更高階的函數;但我沒有看到正在發生的任何組合,也沒有將它的實現委託給Scala摺疊函數。

回答

1

我不是FP專家,但我的理解是,一般來說,fold將整個類型的內容轉換爲另一種類型,如果適用,則考慮原始類型的遞歸結構。您通常爲每種原始類型的案例提供相同類型的結果。

List是最熟悉的。我一直認爲fold基本上是一個帶有累加器的循環,但是您也可以將它看作兩種情況,一種用於Nil的情況,另一種用於Cons的情況。因爲實際類型List是遞歸的,所以它必須是fold

斯卡拉標準庫定義foldOption以及簽名fold[B](ifEmpty: ⇒ B)(f: (A) ⇒ B): B。在這種情況下,因爲類型不是遞歸的,所以fold實際上只是兩種情況的兩種功能。

您的情況與Option非常相似。該類型不是遞歸的,因此fold基本歸結爲將其狀態的所有情況映射到一種輸出類型。

請注意,fold不同於mapflatMap因爲後兩者保留原始類型,但改變其內容。