我指的是这个:
http://www.playframework.org/documentation/api/2.0.2/scala/index.html#play.api.data.Form
如果您搜索名为 fold 的方法,它会显示用于处理表单的方法。这种方法被称为折叠有什么原因吗?鉴于 fold 已经对类似列表的对象具有含义,因此这个名称似乎很容易引起混淆。
我指的是这个:
http://www.playframework.org/documentation/api/2.0.2/scala/index.html#play.api.data.Form
如果您搜索名为 fold 的方法,它会显示用于处理表单的方法。这种方法被称为折叠有什么原因吗?鉴于 fold 已经对类似列表的对象具有含义,因此这个名称似乎很容易引起混淆。
fold
onForm
非常接近 Scala 标准库中的onfold
类Either
,它同样经常用于捕获可能成功(在这种情况下您有一个Right
包含结果)或失败(在这种情况下您有一个Left
包含错误,或者可能是剩余输入等)。因此,我将Either
在此处用作示例。如有必要,只需将图片Form[T]
作为一种。Either[Form[T], T]
我们可以(非常非正式地)将列表想象为具有许多不同的“形状”(空列表、长度为 1、长度为 2 的列表等),并且fold
(或foldLeft
,在以下示例中)作为折叠任何列表的方法一种事物的正确类型,无论它的形状是什么:
scala> def catInts(xs: List[Int]): String = xs.foldLeft("")(_ + _.toString)
catInts: (xs: List[Int])String
scala> catInts(List(1, 2, 3, 4))
res0: String = 1234
scala> catInts(Nil)
res1: String = ""
类似地,我们可以想象Either
有两个形状(Right
和Left
),它fold
是一个方法,可以采用Either
任何一种形状并返回单一类型的东西。假设我们有以下方法将字符串解析为整数并返回Either
:
def parseInt(s: String): Either[String, Int] =
try Right(s.toInt) catch {
case _: NumberFormatException => Left(s)
}
fold
以及用于折叠的以下方法Either
:
def toDefault(e: Either[String, Int]): Int = e.fold(_ => 42, identity)
我们可以这样使用:
scala> toDefault(parseInt("AAARGH!!"))
res2: Int = 42
scala> toDefault(parseInt("123"))
res3: Int = 123
这显然是非常印象派和手摇的,但它可能有助于更直观地了解不同fold
方法在本质上是同一类事物。您可以查看我在上面的评论中链接的问题或有关 catamorphisms 的 Wikipedia 条目以获取更多详细信息。
这是对 {play for scala} 的解释:在 Scala 中,折叠通常用作将多个可能值折叠(或折叠)成单个值的方法的名称。在这种情况下,我们尝试将具有验证错误的表单或正确验证的表单折叠到响应中。