【发布时间】:2023-03-22 05:16:01
【问题描述】:
为什么下面的语句对.map() 有效,而对.flatMap() 无效?
val tupled = input.map(x => (x*2, x*3))
//Compilation error: cannot resolve reference flatMap with such signature
val tupled = input.flatMap(x => (x*2, x*3))
不过,这句话没有问题:
val tupled = input.flatMap(x => List(x*2, x*3))
【问题讨论】:
-
input的类型是什么?检查map和flatMap方法签名。它有不同的参数,这就是你的代码有编译错误的原因。 -
因为
flatMap用于扁平化结构。当你得到M[M[A]]和map时,你会得到M[A]和flatMap。 -
嵌套的
M有时可能不同,N.. 例如List[Option[String]]=>List[String] -
事情是
a.flatMap(a => b)可以大致近似为a.map(a => b).flatten。基本上要让flatMap工作,函数的返回类型应该是一个单子或者你可以展平的东西。