无形:flatmap over tuple无法编译

时间:2014-04-23 17:58:02

标签: scala 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.tuple.FlatMapper[((Int, String), Char),shapeless.poly.identity.type]

println(t flatMap identity)

我错过了什么?             ^

1 个答案:

答案 0 :(得分:5)

它失败是因为flatMap在应用于其左侧的每个元素时期望其函数参数产生元组(某些元素或其他元素)。 identity会在应用于(1, "a")时生成元组,但在应用于'c'时则不会生成元组...在后一种情况下会生成Char。你真正想要的是,

scala> ((1, "a"), Tuple1('c')) flatMap identity
res0: (Int, String, Char) = (1,a,c)

由于Scala没有Tuple1的语法,因此它确实不应该如此漂亮。

或者,您只需要将值附加到元组,将后者的元素增加一,最简单的选项是使用:+

scala> (1, "a") :+ 'c'
res0: (Int, String, Char) = (1,a,c)