使用Shapeless时,推断类型有问题

时间:2014-09-23 09:53:42

标签: scala shapeless

我在获取某些扩展方法的推断类型时遇到了一些麻烦,这些扩展方法使用Shapeless来排列它们应该是什么(我认为)。我可以将表达式的结果分配给具有显式类型的val,然后通过identity或通过val而不使用显式类型aaa和{分别在{1}}以下,但不是直接(bb以下)。

使用Scala 2.10.3,Shapeless 1.2.4,Scalaz 7.0.6进行测试。

c

有没有办法让分配类似于import shapeless._, Tuples._ import scalaz._, Scalaz._ trait FnOps[=>:[_, _], A, B] { val F: Arrow[=>:] val f: A =>: B def &&&:[C](g: A =>: C): A =>: (C, B) = F.combine(g, f) } trait FnProdOps[=>:[_, _], A, B <: Product] { val F: Arrow[=>:] val f: A =>: B def &&&:[C, R <: HList](g: A =>: C)(implicit hlister: HListerAux[B, R], tupler: Tupler[C :: R]): A =>: tupler.Out = F.mapsnd(F.combine(g, f)) { case (c, b) => tupler(c +: hlister(b)) } } trait LowPriorityImplicits0 { implicit def ToFnOps[=>:[_, _], A, B](fn: A =>: B)(implicit A: Arrow[=>:]): FnOps[=>:, A, B] = new FnOps[=>:, A, B] { val F = A val f = fn } } object Implicits extends LowPriorityImplicits0 { implicit def ToFnProdOps[=>:[_, _], A, B <: Product](fn: A =>: B)(implicit A: Arrow[=>:]): FnProdOps[=>:, A, B] = new FnProdOps[=>:, A, B] { val F = A val f = fn } } import Implicits._ // These work val a: Int => Int = _ * 2 val aa: Int => (Int, Int) = a &&&: a val aaa: Int => (Int, Int, Int) = identity(a &&&: a &&&: a) // This works too val b = a &&&: a &&&: a val bb: Int => (Int, Int, Int) = b // This doesn't val c: Int => (Int, Int, Int) = a &&&: a &&&: a 编译?

0 个答案:

没有答案