gpt4 book ai didi

api - 为什么 Play 2.0.2 中有 Form 的 fold 方法?

转载 作者:行者123 更新时间:2023-12-04 15:44:34 26 4
gpt4 key购买 nike

我指的是这个:

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

如果您搜索名为 fold 的方法,它会显示用于处理表单的方法。这种方法被称为折叠有什么原因吗?鉴于 fold 已经对 list like objects 有含义,这个名字似乎很容易引起混淆。

最佳答案

foldForm非常接近foldEither Scala 标准库中的类,它同样经常用于捕获可能成功(在这种情况下您有一个包含结果的 Right)或失败(在这种情况下您有一个 Left 包含错误,或者可能是剩余的输入等)。所以我会用 Either以这里为例。只是图片Form[T]作为一种 Either[Form[T], T]如有必要。

折叠收藏

我们可以(非常非正式地)将列表想象成具有许多不同的“形状”(空列表、长度为一的列表、长度为二的列表等),并且 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作为采用 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 的不同之处。方法基本上是同一种东西。你可以看到 the question I linked in a comment abovethe Wikipedia entry on catamorphisms了解更多详情。

关于api - 为什么 Play 2.0.2 中有 Form 的 fold 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11265352/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com