使用无形和教程中的示例:
import shapeless._
import syntax.std.tuple._
import poly._
object ShapelessPlay extends App{
val t = ((1,"a"),'c')
println(t flatMap identity)
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
could not find implicit value for parameter mapper: shapeless.ops.tuple.FlatMapper[((Int, String), Char),shapeless.poly.identity.type]
Run Code Online (Sandbox Code Playgroud)
println(t flatMap身份)
我错过了什么?^
它失败是因为flatMap在应用于其左侧的每个元素时,期望其函数参数产生元组(某些元素或其他元素).identity在应用时产生一个元组(1, "a"),但在应用于'c'... 时不会产生元组.在后一种情况下,它会产生一个元组Char.你真正想要的是,
scala> ((1, "a"), Tuple1('c')) flatMap identity
res0: (Int, String, Char) = (1,a,c)
Run Code Online (Sandbox Code Playgroud)
因为Scala没有语法,所以它确实不是那么漂亮Tuple1.
或者,你只需要将一个值附加到一个元组,将后者的arity增加一个,最简单的选择是使用:+,
scala> (1, "a") :+ 'c'
res0: (Int, String, Char) = (1,a,c)
Run Code Online (Sandbox Code Playgroud)