異なるタイプのオブジェクトのリストを持っていて、コンパイル時にそのリスト内のオブジェクトについて静的にチェックできるようにしたい場合は、shapelessのHList
のようなものを使用する必要があります。ここでは、2つの異機種間のリストをどのようにして、コンパイル時に、それぞれのリストのそれぞれがthの要素を互いに比較できるかをチェックする方法の例を示します。
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'に追加することはOKですか?このような 'ab'を後でどうやって使うのですか?何らかのインデックスで 'ab'の値を取得したときに期待するタイプは? – SergGr
私はそのような 'ab'-sの配列を持ち、例えばallの最初の値を比較したいと思います - すべての最初の要素が同じ型を持つことが許されます。 –
'HList'を使って調べることができます。 –