Play Framework's (2.x) Form class has a method called fold
who's usage is indicated as:
anyForm.bindFromRequest().fold(
f => redisplayForm(f),
t => handleValidFormSubmission(t)
)
Essentially, the first function parameter is what gets executed on binding failure, and the 2nd on binding success. To me it seems similar to the 'success' and 'error' callbacks of jquery's ajax function.
My question is why did the Play developers call the method "fold"? As a disclaimer I am new to Scala, but I am failing to see the connection between this and the functional Scala fold
operation. The only similarity is that it is a higher order function; but I don't see any combining that is taking place, nor does it delegate internally in its implementation to any of the Scala fold functions.
I'm not an FP expert, but it's my understanding that a
fold
, generally speaking, transforms the contents of a type into another type entirely, respecting the recursive structure of the original type, if applicable. You typically provide a result of the same type for each case of the original type.List
is most familiar. I've always thought offold
as basically a for loop with an accumulator, but you could also look at it as two cases, one for theNil
case and one for theCons
case. Because the actual typeList
is recursive, so must be itsfold
.The Scala standard library defines
fold
onOption
as well, with the signaturefold[B](ifEmpty: ⇒ B)(f: (A) ⇒ B): B
. In this case, because the type is not recursive, thefold
really is simply two functions for two cases.Your case is pretty similar to
Option
. The type isn't recursive, sofold
basically boils down to mapping all cases of its status to one output type.Notice that
fold
differs frommap
andflatMap
in that the latter two preserve the original type, but change its contents.