Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在shapeless中,有两个列表,其中一个包含另一个的typeclass_Scala_Shapeless - Fatal编程技术网

Scala 在shapeless中,有两个列表,其中一个包含另一个的typeclass

Scala 在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使用静态外部构造

在shapeless中,我试图编写一个函数,它包含两个任意长度的hlist
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: ...