Scala 无形状:复杂的HList约束

Scala 无形状:复杂的HList约束,scala,shapeless,Scala,Shapeless,我有以下方法: import shapeless._ import shapeless.UnaryTCConstraint._ def method[L <: HList : *->*[Seq]#λ](list: L) = println("checks") 如何使用另一个参数列表来扩充方法,例如: def method2[L <: HList : *->*[Seq]#λ, M <: HList](list: L)(builder: M => String)

我有以下方法:

import shapeless._
import shapeless.UnaryTCConstraint._
def method[L <: HList : *->*[Seq]#λ](list: L) = println("checks")
如何使用另一个参数列表来扩充
方法
,例如:

def method2[L <: HList : *->*[Seq]#λ, M <: HList](list: L)(builder: M => String) = println("checks")
class Impl[L <: HList : *->*[Seq]#λ, M <: HList]
  (list: L)
  (implicit ev: Comapped.Aux[L, Seq, M]) 
{
  def apply(builder: M => String) = println("checks")
}

def method2[L <: HList : *->*[Seq]#λ, M <: HList]
  (list: L)
  (implicit ev: Comapped.Aux[L, Seq, M]) = new Impl[L, M](list)
如果我这样定义
method2

def method2[L <: HList : *->*[Seq]#λ](list: L)(builder: L => String) = println("checks")
def method2[L*[Seq]#λ](列表:L)(生成器:L=>String)=println(“检查”)

它几乎解决了这个问题,唯一缺少的是构建器将具有Seq[T]类型的元素而不是T类型的元素。

这是
ops.hlist.Comapped
的情况

您需要将
method2
定义为

def method2[L <: HList : *->*[Seq]#λ, M <: HList]
  (list: L)
  (builder: M => String)
  (implicit ev: Comapped.Aux[L, Seq, M])
你不能直接打电话。您可以使用附加的
apply
,或其他方法隐式提供隐式参数列表:

method2(Seq("abc") :: Seq(1) :: Seq(5.5) :: HNil) apply {
  case a :: 1 :: d :: HNil => "works"
}

method2(Seq(“abc”,“def”)::Seq(1,2,3)::Seq(5.5)::HNil{case a::b::c::HNil=>a.toString+b.toString+c.toString}
?它应该可以工作,因为HList的大小相同,并且您对a、b和c的类型没有限制,所以它们应该被正确地推断为
String
Int
Double
class Impl[L <: HList : *->*[Seq]#λ, M <: HList]
  (list: L)
  (implicit ev: Comapped.Aux[L, Seq, M]) 
{
  def apply(builder: M => String) = println("checks")
}

def method2[L <: HList : *->*[Seq]#λ, M <: HList]
  (list: L)
  (implicit ev: Comapped.Aux[L, Seq, M]) = new Impl[L, M](list)
method2(Seq("abc") :: Seq(1) :: Seq(5.5) :: HNil) apply {
  case a :: 1 :: d :: HNil => "works"
}