Scala 在shapeless中,有两个列表,其中一个包含另一个的typeclass
在shapeless中,我试图编写一个函数,它包含两个任意长度的hlistScala 在shapeless中,有两个列表,其中一个包含另一个的typeclass,scala,shapeless,Scala,Shapeless,在shapeless中,我试图编写一个函数,它包含两个任意长度的hlistl1和l2,它们具有以下属性: l1和l2的长度相同 l2包含l1的确切类型,封装在一个常量外部类型构造函数中 所以,如果l1是 1 :: 1.2 :: "hello" :: HNil` l2可能是 Ordering[Int] :: Ordering[Double] :: Ordering[String] :: HNil 使用unarytconstraint和LengthAux可以限制长度,并要求为l2使用静态外部构造
l1
和l2
,它们具有以下属性:
l1
和l2
的长度相同l2
包含l1
的确切类型,封装在一个常量外部类型构造函数中l1
是
1 :: 1.2 :: "hello" :: HNil`
l2
可能是
Ordering[Int] :: Ordering[Double] :: Ordering[String] :: HNil
使用unarytconstraint
和LengthAux
可以限制长度,并要求为l2
使用静态外部构造函数,但是让它们一致已成为一个问题
有什么想法吗?
Mapped
精确地提供了这个约束,而不需要额外的长度。发件人:
类型类,该类见证包装的每个元素的结果
HList
L
in类型构造函数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
导入无形状_
def foo[L1 foo(L1,l3)
:17:错误:找不到参数ev的隐式值:。。。
正如所料。对于2.0,只需添加一个shapeless.ops.hlist.\u
导入MappedAux
并用MappedAux
替换MappedAux
,您就可以开始了。而不是将其视为类型类,您真正想要的是一个类型All
(从Agda的术语中窃取),它采用一种类型*->*
。
(以下简称“谓词”在类型上;排序(在您的案例中为
)我可以用纯Scala编写它,但我确信有一种不成形的友好方式,所以我会等待其他人出现。这不是一个好的解决方案,但作为概念的证明:。@senia:如果没有映射的,这实际上不会是一个半坏的解决方案。很漂亮,这正是我所期待的谢谢,谢谢!
scala> foo(l1, l2)
scala> foo(l1, l3)
<console>:17: error: could not find implicit value for parameter ev: ...