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"
}