为什么在Play 2.0.2中有Form的折叠方法?

时间:2012-06-29 16:13:12

标签: api scala playframework

我指的是:

http://www.playframework.org/documentation/api/2.0.2/scala/index.html#play.api.data.Form

如果搜索名为fold的方法,则会显示用于处理表单的方法。这种方法被称为折叠是否有原因?鉴于折叠已经具有列表类似对象的含义,似乎这个名称很容易引起混淆。

2 个答案:

答案 0 :(得分:10)

fold上的Form非常接近Scala标准库中fold类的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想象为具有两个形状(RightLeft),并将其fold作为一种方法,其中EitherEither塑造并返回一种东西。假设我们有以下方法将字符串解析为整数并返回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

这显然非常印象派和手工波浪,但它可能有助于更直观地了解不同的{{1}}方法是如何从根本上做同样的事情。您可以查看the question I linked in a comment abovethe Wikipedia entry on catamorphisms了解更多详情。

答案 1 :(得分:-2)

这是{play for scala}的解释:在Scala中,fold通常用作将多个可能值折叠(或折叠)为单个值的方法的名称。在这种情况下,我们尝试将带有验证错误的表单或正确验证的表单折叠到响应中。