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

时间:2014-01-08 19:03:22

标签: scala shapeless

在无形状中,我正在尝试编写一个函数,使得任意长度的两个HList l1l2具有以下属性:

  1. l1l2的长度相同。
  2. l2包含l1的确切类型,包含在常量外部类型构造函数中。
  3. 所以,如果l1

    1 :: 1.2 :: "hello" :: HNil`
    

    l2可能是

    Ordering[Int] :: Ordering[Double] :: Ordering[String] :: HNil
    

    使用UnaryTCConstraintLengthAux可以限制长度,并且需要l2的静态外部构造函数,但是如果它们符合,则会成为问题。

    关于如何实现它的任何想法?

1 个答案:

答案 0 :(得分:9)

Mapped正好提供了这种约束,而无需Length。来自the documentation

  

键入类,见证包装每个元素的结果   类型构造函数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

然后:

scala> foo(l1, l2)

scala> foo(l1, l3)
<console>:17: error: could not find implicit value for parameter ev: ...

正如所料。对于2.0,只需添加shapeless.ops.hlist._导入,然后将MappedAux替换为Mapped.Aux,即可开始使用。