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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |