加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:59:29 所属栏目:安全 来源:网络整理
导读:我是指这个: http://www.playframework.org/documentation/api/2.0.2/scala/index.html#play.api.data.Form 如果搜索名为fold的方法,则会显示用于处理表单的方法.这种方法被称为折叠是否有原因?鉴于折叠已经具有列表类对象的含义,似乎这个名称很容易引起混
我是指这个:

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

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

解决方法

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

折叠收藏品

我们可以(非常非正式地)将列表想象为具有许多不同的“形状”(空列表,长度为1,长度为2的列表等),以及折叠(或在以下示例中为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:

def parseInt(s: String): Either[String,Int] =
  try Right(s.toInt) catch {
    case _: NumberFormatException => Left(s)
  }

以下方法使用折叠来折叠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

这显然是非常印象派和手工波浪,但它可能有助于更直观地了解不同的折叠方法是如何从根本上相同的事情.有关详细信息,请参阅the question I linked in a comment above或the Wikipedia entry on catamorphisms.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读