8

shapeless では、2 つの HList を取り、次のプロパティを示す任意の長さの関数を作成しようとしていl1ますl2

  1. との長さはl1同じl2です。
  2. l2の正確な型が含まれておりl1、定数の外側の型コンストラクターにラップされています。

だから、だっl1たら

1 :: 1.2 :: "hello" :: HNil`

l2になり得る

Ordering[Int] :: Ordering[Double] :: Ordering[String] :: HNil

とを使用するUnaryTCConstraintLengthAux、長さを制約し、 の静的外部コンストラクターを必要としますが、l2それらを適合させることが問題になりました。

どうすればそれを実行できるかについてのアイデアはありますか?

4

1 に答える 1

10

Mappedを追加する必要なく、正確にこの制約を提供しますLengthドキュメントから:

HList L型コンストラクタFでの各要素をラップした結果が であることを証明する型クラス Out

1.2.4 での外観は次のとおりです。

import shapeless._

def foo[L1 <: HList, L2 <: HList](l1: L1, l2: L2)(implicit
  ev: MappedAux[L1, Ordering, L2]
) = ()

val l1 = 1 :: 1.2 :: "hello" :: HNil
val l2 = Ordering[Int] :: Ordering[Double] :: Ordering[String] :: HNil
val l3 = Ordering[Int] :: Ordering[Double] :: Ordering[Char] :: HNil

その後:

scala> foo(l1, l2)

scala> foo(l1, l3)
<console>:17: error: could not find implicit value for parameter ev: ...

予想通り。2.0 の場合は、shapeless.ops.hlist._インポートを追加して置き換えるMappedAuxだけでMapped.Aux準備完了です。

于 2014-01-08T19:52:50.203 に答える