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

scala – flatMap究竟做了什么?

发布时间:2020-12-16 10:06:50 所属栏目:安全 来源:网络整理
导读:对于学校的编码工作,我必须做平板图的工作,但我完全不知道它做了什么,我已经在网上阅读了几页,并在我的教科书中阅读,但我仍然没有真正理解它的作用.我知道地图有什么作用,但由于某种原因,我很难将头部包裹在flatmap中.有人可以帮忙吗?谢谢. 只是为了添加更
对于学校的编码工作,我必须做平板图的工作,但我完全不知道它做了什么,我已经在网上阅读了几页,并在我的教科书中阅读,但我仍然没有真正理解它的作用.我知道地图有什么作用,但由于某种原因,我很难将头部包裹在flatmap中.有人可以帮忙吗?谢谢.

只是为了添加更多信息 – 当我在线查看示例时,我会看到flatmap如何返回与地图不同的内容.但是当flatmap被调用时,它实际上在做什么呢? flatmap如何实际工作?它在返回结果之前做了什么?

解决方法

Functors定义具有类型的map

trait Functor[F[_]] {
    def map[A,B](f: A => B)(v: F[A]): F[B]
}

Monads是函数,支持两个额外的操作:

trait Monad[M[_]] extends Functor[M] {
    def pure[A](v: A): M[A]
    def join[A](m: M[M[A]]): M[A]
}

加入展平嵌套值,例如如果m是List,则join具有类型

def joinList[A](l: List[List[A]]): List[A]

如果你有一个monad m并且你映射它,如果b是相同的monadic类型会发生什么?例如:

def replicate[A](i: Int,value: A): List[A] = ???
val f = new Functor[List] {
    def map[A,B](f: A => B)(v: List[A]) = v.map(f)
}

然后

f.map(x => replicate(x,x))(List(1,2,3)) == List(List(1),List(2,2),List(3,3,3))

这具有类型List [List [Int]],而输入是List [Int].对于希望每个步骤返回相同输入类型的操作链而言,这是相当常见的.由于List也可以制作成monad,因此您可以使用join轻松创建这样的列表:

listMonad.join(List(List(1),3))) == List(1,3)

现在您可能想要编写一个函数将这两个操作合并为一个:

trait Monad[M] {
   def flatMap[A,B](f: A => M[B])(m: M[A]): M[B] = join(map(f)(m))
}

然后你可以简单地做:

listMonad.flatMap(List(1,3),x => replicate(x,x)) == List(1,3)

flatMap的确切取决于monad类型构造函数M(本例中为List),因为它依赖于map和join.

(编辑:李大同)

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

    推荐文章
      热点阅读