8

在无形中,我正在尝试编写一个函数,该函数采用两个 HListsl1l2任意长度,具有以下属性:

  1. l1和的长度l2相同。
  2. l2包含 的确切类型l1,包裹在一个常量外部类型构造函数中。

所以,如果l1

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

l2可能

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

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

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

4

1 回答 1

10

Mapped精确地提供了这种约束,而不需要额外的Length. 从文档中

HList L类型类见证包装in 类型构造函数的每个元素的结果 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._导入并替换MappedAuxMapped.Aux即可。

于 2014-01-08T19:52:50.203 回答