Play 框架 (2.x)表格类 http://www.playframework.com/documentation/2.0/api/scala/index.html#play.api.data.Form有一个方法叫做fold
who 的用法表示为:
anyForm.bindFromRequest().fold(
f => redisplayForm(f),
t => handleValidFormSubmission(t)
)
本质上,第一个函数参数是绑定失败时执行的函数,第二个函数参数是绑定成功时执行的函数。对我来说,它似乎类似于 jquery 的 ajax 函数的“成功”和“错误”回调。
我的问题是为什么 Play 开发者将该方法称为“fold”?作为免责声明,我是 Scala 新手,但我看不到它与函数式 Scala 之间的联系fold
手术。唯一的相似之处在于它是一个高阶函数;但我没有看到任何组合正在发生,也没有在其实现中内部委托给任何 Scala 折叠函数。
我不是 FP 专家,但我的理解是fold
一般来说,将一种类型的内容完全转换为另一种类型,并尊重原始类型的递归结构(如果适用)。您通常为原始类型的每种情况提供相同类型的结果。
List
是最熟悉的。我一直想到fold
基本上是一个带有累加器的 for 循环,但您也可以将其视为两种情况,一种是Nil
案例和一个Cons
案件。因为实际类型List
是递归的,所以它的必然是fold
.
Scala 标准库定义了fold
on Option
以及签名fold[B](ifEmpty: ⇒ B)(f: (A) ⇒ B): B
。在这种情况下,由于类型不是递归的,因此fold
实际上只是针对两种情况的两个函数。
你的情况非常类似于Option
。该类型不是递归的,所以fold
基本上归结为将其状态的所有情况映射到一种输出类型。
请注意fold
不同于map
and flatMap
因为后两者保留了原始类型,但改变了其内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)