在无形状中l1,我正在尝试编写一个函数,它需要两个l2具有任意长度的HLists ,它们具有以下属性:
l1和l2是一样的.l2包含l1在常量外部类型构造函数中包含的确切类型.所以,如果l1是的话
1 :: 1.2 :: "hello" :: HNil`
Run Code Online (Sandbox Code Playgroud)
l2 可能
Ordering[Int] :: Ordering[Double] :: Ordering[String] :: HNil
Run Code Online (Sandbox Code Playgroud)
使用UnaryTCConstraint并LengthAux让我约束长度并需要一个静态外部构造函数l2,但是它们符合它们已经成为一个问题.
关于我如何去做的任何想法?
Mapped提供精确的约束,而无需额外的需要Length.从文档:
型类目睹包装的各要素的结果
HListL在类型构造F是Out.
以下是它在1.2.4中的表现:
import shapeless._
def foo[L1 <: HList, L2 <: HList](l1: L1, l2: L2)(implicit
ev: MappedAux[L1, Ordering, L2]
) = ()
val l1 = 1 :: 1.2 :: "hello" :: HNil
val l2 = Ordering[Int] :: Ordering[Double] :: Ordering[String] :: HNil
val l3 = Ordering[Int] :: Ordering[Double] :: Ordering[Char] :: HNil
Run Code Online (Sandbox Code Playgroud)
然后:
scala> foo(l1, l2)
scala> foo(l1, l3)
<console>:17: error: could not find implicit value for parameter ev: ...
Run Code Online (Sandbox Code Playgroud)
正如所料.对于2.0,只需添加一个shapeless.ops.hlist._导入并替换MappedAux为Mapped.Aux,您就可以开始了.