다른 유형의 객체 목록을 갖고 있고 컴파일 타임에 해당 목록의 객체에 대해 정적으로 계속 확인하려면, shapeless에서 HList
과 같은 것을 사용해야합니다. 다음은 두 개의 이기종 목록을 가지고 어떻게 컴파일 타임에 각 목록이 서로 비교 될 수 있는지를 보여주는 예입니다.
import shapeless._
import shapeless.ops.hlist.{LiftAll, Zip, Mapper}
object lt extends Poly1 {
implicit def instance[A] = at[(Ordering[A], A, A)] {
case (ord, a, b) => ord.lt(a, b)
}
}
def areLessThan[L <: HList, O <: HList, OLL <: HList](a: L, b: L)(
implicit
ord: LiftAll.Aux[Ordering, L, O],
zip: Zip.Aux[O :: L :: L :: HNil, OLL],
map: Mapper[lt.type, OLL]
) = zip(ord.instances :: a :: b :: HNil).map(lt)
를 사용 :
scala> val a = 1 :: "b" :: Option(4L) :: HNil
a: Int :: String :: Option[Long] :: shapeless.HNil = 1 :: b :: Some(4) :: HNil
scala> val b = 2 :: "a" :: Option(7L) :: HNil
b: Int :: String :: Option[Long] :: shapeless.HNil = 2 :: a :: Some(7) :: HNil
scala> areLessThan(a, b)
res10: Boolean :: Boolean :: Boolean :: shapeless.HNil = true :: false :: true :: HNil
당신이 실제로 한 각 유형에 대한 몇 가지'주문 [T]'이 있기 때문에 다른 비교할 수없는 유형의 단일 콜렉션 오브젝트에 넣어 원하는 사실인가요? 예를 들어, 각 구성 요소에 순서가있는 경우 튜플에 대한 순서가 있습니다. 따라서 목록에있는 다른 값과 근본적으로 비교할 수 없다는 가정하에 터플'(1.0, "some string")을'ab'에 추가하는 것이 좋습니다. 그런 'ab'를 나중에 어떻게 사용 하시겠습니까? 어떤 인덱스로'ab'에서 값을 얻을 때 어떤 타입이 될 것으로 예상합니까? – SergGr
필자는 그러한'ab'-s의 배열을 가질 것이고, 예를 들어 모든 것의 첫 번째 값을 비교하기를 원할 것입니다 - 모든 첫 번째 요소가 같은 유형을 갖는다는 것을 인정합니다. –
당신은'HList'를 사용하기를 원할 것입니다. –