如何使函数反转HList

时间:2015-10-19 16:20:02

标签: scala shapeless

我有一个像这样的示例代码

implicit def func[T <: HList, F, R](
  implicit fp: FnToProduct.Aux[F, Reverse[T]#Out => R], 
  rev: Reverse[T]): (F, T) => R = 
  (f: F, t: T) => f.toProduct(t.reverse)

所以我想要的是要求编译器隐式地解析函数F,将HList反向作为其输入和输出R。例如,

type R = java.util.Date
type F2 = Function2[String, Int, R]
type TT = Int :: String :: HNil

implicitly[(F2, TT) => R]

虽然implicit func编译,但上面的示例代码无法解析我认为它应该能够找到的隐式。这有什么问题?

1 个答案:

答案 0 :(得分:4)

类型投影在Shapeless中很少有用,因为编译器静态地对例如Reverse[T]#Out。如果你可以在它的位置写rev.Out,那就太好了,但你不能(那是a long story ...)。相反,您需要添加一个类型参数来表示反转的HList

import shapeless._, ops.function.FnToProduct, ops.hlist.Reverse

implicit def func[T <: HList, TR <: HList, F, R](implicit
  fp: FnToProduct.Aux[F, TR => R],
  rev: Reverse.Aux[T, TR]
): (F, T) => R = (f: F, t: T) => fp(f)(rev(t))

这将按预期工作,但我建议不要将这样的函数放入隐式范围。