scala - 如何简化嵌套 map 调用?

标签 scala functor

假设我有一些嵌套仿函数,例如List[Option[Int]],并且需要调用最内层的map

现在我正在使用嵌套的maps:

scala> val opts: List[Option[Int]] = List(Some(0), Some(1))
opts: List[Option[Int]] = List(Some(0), Some(1))

scala> opts.map(o => o.map(_ + 1))
res0: List[Option[Int]] = List(Some(1), Some(2))

例如,如果我有3个嵌套级别,该怎么办?
有嵌套maps的任何简单替代方法吗?

最佳答案

是的,使用scalaz.Functor可以实现:

scala> import scalaz.Functor
import scalaz.Functor

scala> import scalaz.std.list._
import scalaz.std.list._

scala> import scalaz.std.option._
import scalaz.std.option._

scala> Functor[List].compose[Option].map(List(some(0), some(1)))(_ + 1)
res1: List[Option[Int]] = List(Some(1), Some(2))

但是,这比使用嵌套的map简单地调用map的时间更长。如果您经常映射嵌套结构,则可以创建辅助函数:
def map2[F[_], G[_], A, B](fg: F[G[A]])(f: A => B)
  (implicit F0: Functor[F], G0: Functor[G]): F[G[B]] =
  F0.map(fg)(g => G0.map(g)(f))

def map3[F[_], G[_], H[_], A, B](fg: F[G[H[A]]])(f: A => B)
  (implicit F0: Functor[F], G0: Functor[G], H0: Functor[H]): F[G[H[B]]] =
  F0.map(fg)(g => G0.map(g)(h => H0.map(h)(f)))

...

用法:
scala> map2(List(some(0), some(1)))(_ + 1)
res3: List[Option[Int]] = List(Some(1), Some(2))

scala> map3(List(some(some(0)), some(some(1))))(_ + 1)
res4: List[Option[Option[Int]]] = List(Some(Some(1)), Some(Some(2)))

关于scala - 如何简化嵌套 map 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31284131/

相关文章:

javascript - 在 Play 中使用 cookie 刷新页面

scala - 如何在spark数据框中用\N替换空字符串

performance - Akka 可扩展性和性能基准测试用例

c++ - 避免显式仿函数模板类型

c++ - 什么时候无状态类仿函数可以代替 c 风格的函数?

c++ - 创建类型特征以检测 C++ 中的仿函数

haskell - Functor 实例 for (newtype Mu f = InF {outF::f (Mu f)})

c++ - 仿函数 + 成员指针来创建信号对象

json - 将 JSON 数据引导到 Scala PlayFramework 模板中

scala - 避免 shapeless 中两个类型类定义之间发生冲突的最佳方法是什么