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

scala – 选项上的折叠有什么关系,等等,并折叠到可移动?

发布时间:2020-12-16 19:01:32 所属栏目:安全 来源:网络整理
导读:Scalaz为各种ADT提供了一个名为fold的方法,如布尔值,[_],验证[_,_],[_,_]等.该方法基本上接收到与给定ADT相关的所有可能情况的函数.换句话说,模式匹配如下所示: x match { case Case1(a,b,c) = f(a,c) case Case2(a,b) = g(a,b) . . case CaseN = z} 相当于
Scalaz为各种ADT提供了一个名为fold的方法,如布尔值,[_],验证[_,_],[_,_]等.该方法基本上接收到与给定ADT相关的所有可能情况的函数.换句话说,模式匹配如下所示:

x match {
  case Case1(a,b,c) => f(a,c)
  case Case2(a,b) => g(a,b)
  .
  .
  case CaseN => z
}

相当于:

x.fold(f,g,...,z)

一些例子:

scala> (9 == 8).fold("foo","bar")
res0: java.lang.String = bar

scala> 5.some.fold(2 *,2)
res1: Int = 10

scala> 5.left[String].fold(2 +,"[" +)
res2: Any = 7

scala> 5.fail[String].fold(2 +,"[" +)
res6: Any = 7

同时,对于可遍历[_]类型,具有相同名称的操作,遍历集合对其元素执行某些操作,并累加结果值.例如,

scala> List(2,90,11).foldLeft("Contents: ")(_ + _.toString + " ")
res9: java.lang.String = "Contents: 2 90 11 "

scala> List(2,11).fold(0)(_ + _)
res10: Int = 103

scala> List(2,11).fold(1)(_ * _)
res11: Int = 1980

为什么这两个操作用相同的名称识别 – 折叠/变形?我没有看到两者之间有任何相似之处/关系.我失踪了什么

解决方法

我认为你所遇到的问题是你看到这些东西是基于它们的实现而不是它们的类型.考虑这种类型的简单表示:

List[A] = Nil 
        | Cons head: A tail: List[A]

Option[A] = None
          | Some el: A

现在我们来看一下Option的折叠:

fold[B] = (noneCase: => B,someCase: A => B) => B

所以,在选项上,它将所有可能的情况减少到B中的一些值,并返回.现在,我们来看看List的同样的事情:

fold[B] = (nilCase: => B,consCase: (A,List[A]) => B) => B

但是,请注意,我们在List [A]上有递归调用.我们必须以某种方式折叠,但是我们知道列表[A]上的fold [B]总是返回B,所以我们可以这样重写:

fold[B] = (nilCase: => B,B) => B) => B

换句话说,我们用B替换List [A],因为折叠它总是返回一个B,给定了fold的类型签名.现在,我们来看看foldRight的Scala(用例)类型签名:

foldRight[B](z: B)(f: (A,B) ? B): B

说,这是否提醒你一些事情?

(编辑:李大同)

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

    推荐文章
      热点阅读