Scala 无形状:元组上的flatMap无法编译
使用shapeless和教程中的示例:Scala 无形状:元组上的flatMap无法编译,scala,shapeless,Scala,Shapeless,使用shapeless和教程中的示例: import shapeless._ import syntax.std.tuple._ import poly._ object ShapelessPlay extends App{ val t = ((1,"a"),'c') println(t flatMap identity) } 我得到以下错误: could not find implicit value for parameter mapper: shapeless.ops.tu
import shapeless._
import syntax.std.tuple._
import poly._
object ShapelessPlay extends App{
val t = ((1,"a"),'c')
println(t flatMap identity)
}
我得到以下错误:
could not find implicit value for parameter mapper: shapeless.ops.tuple.FlatMapper[((Int, String), Char),shapeless.poly.identity.type]
println(t平面图标识)
我错过了什么?
^它失败了,因为
flatMap
期望它的函数参数在应用于其左侧的每个元素时产生一个元组(具有某种算术或其他形式)<代码>标识应用于(1,“a”)
时生成元组,但应用于'c'
时不生成元组。。。在后一种情况下,它产生一个字符
。你真正想要的是
scala> ((1, "a"), Tuple1('c')) flatMap identity
res0: (Int, String, Char) = (1,a,c)
无可否认,这并不像它应该的那么漂亮,因为Scala没有Tuple1
的语法
或者,如果您希望向元组添加一个值,将元组的arity增加一,最简单的选项是使用:+
scala> (1, "a") :+ 'c'
res0: (Int, String, Char) = (1,a,c)
这可能值得作为一个例子添加到功能概述中,因为这是最常见的展平场景之一。我已经用一种更简单的方法更新了答案,将单个值附加到元组中。。。这就是你的想法吗?我在烫伤中的常见用例是必须压平像((a,b),c)这样的东西,我通常会天真地{case((a,b,c)=>(a,b,c)}。我正在尝试使用.flatte方法。按您想要的方式运行的展平操作当然是可能的,但它与flatMap标识不同。参见示例。