【问题标题】:Play Framework Form "fold" method naming rationalePlay Framework Form“折叠”方法命名原理
【发布时间】:2014-06-12 06:17:43
【问题描述】:

Play Framework 的 (2.x) Form class 有一个名为 fold 的方法,其用法表示为:

anyForm.bindFromRequest().fold(
  f => redisplayForm(f),
  t => handleValidFormSubmission(t)
)

本质上,第一个函数参数是绑定失败时执行的,第二个是绑定成功时执行的。在我看来,它类似于 jquery ajax 函数的“成功”和“错误”回调。

我的问题是为什么 Play 开发人员将方法称为“折叠”?作为免责声明,我是 Scala 的新手,但我看不到这与功能性 Scala fold 操作之间的联系。唯一的相似之处是它是一个高阶函数;但我没有看到任何正在发生的组合,也没有在内部将其实现委托给任何 Scala 折叠函数。

【问题讨论】:

    标签: scala functional-programming playframework-2.0


    【解决方案1】:

    我不是 FP 专家,但我的理解是,fold 通常会将一个类型的内容完全转换为另一种类型,尊重原始类型的递归结构(如果适用)。您通常为原始类型的每个案例提供相同类型的结果。

    List 是最熟悉的。我一直认为fold 基本上是一个带有累加器的for 循环,但您也可以将其视为两种情况,一种用于Nil 情况,一种用于Cons 情况。因为List的实际类型是递归的,所以必须是它的fold

    Scala 标准库也在Option 上定义了fold,签名为fold[B](ifEmpty: ⇒ B)(f: (A) ⇒ B): B。在这种情况下,由于类型不是递归的,fold 实际上只是两种情况下的两个函数。

    您的情况与Option 非常相似。该类型不是递归的,因此fold 基本上归结为将其状态的所有情况映射到一种输出类型。

    请注意,foldmapflatMap 的不同之处在于后两者保留了原始类型,但更改了其内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 2012-06-17
      相关资源
      最近更新 更多