UnaryTCConstraint
( *->*
) 不用于映射,它是一个约束(常见于HList
s、Coproduct
s、案例类和密封特征)。对于映射,有类型类NatTRel
、Mapped
、Comapped
等Mapper
(分别用于HList
s 和Coproduct
s)。
尝试约束和类型类
def doStuff[KList <: HList: *->*[Option]#λ, L <: HList](klist: KList)(implicit
natTRel: NatTRel[KList, Option, L, Either[String, *]]
): L = natTRel.map(myNaturalTransformation, klist)
或者只是输入类
def doStuff[KList <: HList, L <: HList](klist: KList)(implicit
natTRel: NatTRel[KList, Option, L, Either[String, *]]
): L = natTRel.map(myNaturalTransformation, klist)
L
或通过PartiallyApplied
模式隐藏类型参数
def doStuff[KList <: HList] = new PartiallyAppliedDoStuff[KList]
class PartiallyAppliedDoStuff[KList <: HList] {
def apply[L <: HList](klist: KList)(implicit
natTRel: NatTRel[KList, Option, L, Either[String, *]]
): L = natTRel.map(myNaturalTransformation, klist)
}
或通过存在隐藏类型参数L
(但返回类型不精确)
def doStuff[KList <: HList](klist: KList)(implicit
natTRel: NatTRel[KList, Option, _, Either[String, *]]
) = natTRel.map(myNaturalTransformation, klist)
或使用扩展方法
implicit class NatTRelOps[KList <: HList](val klist: KList) extends AnyVal {
def map[F[_], G[_], L <: HList](f: F ~> G)(implicit
natTRel: NatTRel[KList, F, L, G]
): L = natTRel.map(f, klist)
}
def doStuff[KList <: HList, L <: HList](klist: KList)(implicit
natTRel: NatTRel[KList, Option, L, Either[String, *]]
): L = klist.map(myNaturalTransformation)
测试:
doStuff(Option(1) :: Option("a") :: HNil) // compiles
//doStuff(Option(1) :: Option("a") :: true :: HNil) // doesn't compile