在无形状中,有两个列表,其中一个包含另一个的类型

Ref*_*fer 8 scala shapeless

在无形状中l1,我正在尝试编写一个函数,它需要两个l2具有任意长度的HLists ,它们具有以下属性:

  1. 长度l1l2是一样的.
  2. 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)

使用UnaryTCConstraintLengthAux让我约束长度并需要一个静态外部构造函数l2,但是它们符合它们已经成为一个问题.

关于我如何去做的任何想法?

Tra*_*own 9

Mapped提供精确的约束,而无需额外的需要Length.从文档:

型类目睹包装的各要素的结果 HList L在类型构造FOut.

以下是它在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._导入并替换MappedAuxMapped.Aux,您就可以开始了.