HList 的类型级约束,提取函数域
Type-level constraint on HList, extract function domain
我正在编写一个组合器,它接受 HList
的 Option[A] :: Option[AA] :: Option[AAA]...
等等
它还接受类型为 A,AA, AAA,... => U
的函数f
。而且它 returns U
。如何为我的组合器编码类型签名?我需要假设我的 A, AA, AAA
也是 Monoid,所以如果我的选项是 None
,我可以调用 Monoid 零来为 f
创建值。我是无形新手,谢谢!
这是我目前所拥有的,但我缺少很多限制条件。
H
的每个元素都是一个 Option[A], Option[AA], ...
A, AA, AAA
都是幺半群。
-
HList
D 只是
与没有选项的 H
相同。
def combinator[H <: HList, D <: HList, U](in: H, f : D => U) : U =
f(in map {
case None : Option[A] => implicitly[Monoid[A]].zero
case Some(v) => v
})
尝试
import shapeless.{HList, ::, HNil, Id, Poly1}
import shapeless.ops.hlist.{Comapped, LiftAll, Mapper, NatTRel}
import cats.Monoid
import cats.syntax.option._
import cats.instances.int._
import cats.instances.string._
import cats.instances.double._
object monoidPoly extends Poly1 {
implicit def cse[A: Monoid]: Case.Aux[Option[A], A] = at {
case None => implicitly[Monoid[A]].empty
case Some(v) => v
}
}
def combinator[H <: HList, D <: HList, U](in: H, f: D => U)(
implicit
// comapped: Comapped.Aux[H, Option, D],
// natTRel: NatTRel[H, Option, D, Id],
// liftAll: LiftAll[Monoid, D],
mapper: Mapper.Aux[monoidPoly.type, H, D]
): U =
f(in map monoidPoly)
combinator(1.some :: none[String] :: 2.0.some :: HNil, (_ : Int :: String :: Double :: HNil).toString)
// "1 :: :: 2.0 :: HNil"
我正在编写一个组合器,它接受 HList
的 Option[A] :: Option[AA] :: Option[AAA]...
等等
它还接受类型为 A,AA, AAA,... => U
的函数f
。而且它 returns U
。如何为我的组合器编码类型签名?我需要假设我的 A, AA, AAA
也是 Monoid,所以如果我的选项是 None
,我可以调用 Monoid 零来为 f
创建值。我是无形新手,谢谢!
这是我目前所拥有的,但我缺少很多限制条件。
H
的每个元素都是一个Option[A], Option[AA], ...
A, AA, AAA
都是幺半群。-
HList
D 只是 与没有选项的H
相同。
def combinator[H <: HList, D <: HList, U](in: H, f : D => U) : U =
f(in map {
case None : Option[A] => implicitly[Monoid[A]].zero
case Some(v) => v
})
尝试
import shapeless.{HList, ::, HNil, Id, Poly1}
import shapeless.ops.hlist.{Comapped, LiftAll, Mapper, NatTRel}
import cats.Monoid
import cats.syntax.option._
import cats.instances.int._
import cats.instances.string._
import cats.instances.double._
object monoidPoly extends Poly1 {
implicit def cse[A: Monoid]: Case.Aux[Option[A], A] = at {
case None => implicitly[Monoid[A]].empty
case Some(v) => v
}
}
def combinator[H <: HList, D <: HList, U](in: H, f: D => U)(
implicit
// comapped: Comapped.Aux[H, Option, D],
// natTRel: NatTRel[H, Option, D, Id],
// liftAll: LiftAll[Monoid, D],
mapper: Mapper.Aux[monoidPoly.type, H, D]
): U =
f(in map monoidPoly)
combinator(1.some :: none[String] :: 2.0.some :: HNil, (_ : Int :: String :: Double :: HNil).toString)
// "1 :: :: 2.0 :: HNil"