我在获取某些扩展方法的推断类型时遇到了一些麻烦,这些扩展方法使用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
编译?