Find type class instances for Shapeless HList

前端 未结 1 735
一向
一向 2021-02-08 23:32

Say that I have a trait Show[T] such as the one in Scalaz: https://github.com/scalaz/scalaz/blob/scalaz-seven/core/src/main/scala/scalaz/Show.scala#L9

I als

相关标签:
1条回答
  • 2021-02-08 23:51

    If your goal is to apply the Show instances and you don't otherwise care about building up an HList of them, the easiest approach is probably to use a polymorphic function:

    import scalaz._, Scalaz._, shapeless._
    
    val xs = "1" :: 2 :: 3L :: HNil
    
    object show extends Poly1 {
      implicit def forShowable[A: Show] = at[A](_.shows)
    }
    
    val strings: String :: String :: String :: HNil = xs map show
    

    You could get an HList of the instances by changing the Poly1 a bit:

    object showInstance extends Poly1 {
      implicit def forShowable[A: Show] = at[A](_ => Show[A])
    }
    

    In some cases it can be useful to define your own type class to collect evidence that you've got certain type class instances:

    trait AllShowable[L <: HList, S <: HList] {
      def instances: S
    }
    
    implicit object hnilAllShowable extends AllShowable[HNil, HNil] {
      def instances = HNil
    }
    
    implicit def hlistAllShowable[H: Show, TL <: HList, TS <: HList](
      implicit ts: AllShowable[TL, TS]
    ) = new AllShowable[H :: TL, Show[H] :: TS] {
      def instances = Show[H] :: ts.instances
    }
    

    But usually mapping with a polymorphic function that requires the instances will work just fine.

    0 讨论(0)
提交回复
热议问题