4

マップ内のキーと値のタイプ間の依存関係をエンコードすると便利な場合があります。次のタイプを検討してください。

type MyPairs = Seq[(TypeTag[T], T) forSome {type T}]

ここで、シーケンス内の各ペアは同じ type を持つ必要がありTます。しかし、そのようなタイプは、マップのような使用法に関してはあまり便利ではありません。ただし、 2つの独立した型パラメーターがあり、それらを「グループ化」して単一の存在型を使用することはできないためMap[K, V]、のような依存関係を表現できません。Mapナイーブ バリアント

type MyMap = Map[TypeTag[T], T] forSome {type T}

単一のタイプを強制するだけTです。すべてのMyMapエントリに適用されますが、それぞれ個別に適用されるわけではありません。

私が思うもう一つの極端な例は、

type MyMap = Map[TypeTag[_], _]

しかし、もちろん、これは広すぎる定義であり、キーと値の型の任意の組み合わせが可能です。

だから私の質問は、Scala でそのような型をエンコードすることは可能ですか? はいの場合、どのように?

4

1 に答える 1

3

他の人が指摘したように、異種マップを使用する必要があります。shapeless プロジェクトには、次の実装があります。

https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-1.2.4#heterogenous-maps

これにより、次のことが可能になります。

import shapeless._
class Constrainer[K, V]
implicit def allowed[T] = new Constrainer[Class[T], T]
val hmap = HMap[Constrainer](classOf[String] -> "Hi there", classOf[Int] -> 3) // this compiles
val hmapFail = HMap[Constrainer](classOf[String] -> 3) // this won't compile

TypeTag を使用した特定の例:

import shapeless._
import scala.reflect.runtime.universe._
class Constrainer[K, V]
implicit def allowed[T] = new Constrainer[TypeTag[T], T]
val hmap = HMap[Constrainer](typeTag[String] -> "hello", typeTag[Int] -> 2) // this compiles
val hmapFail = HMap[Constrainer](typeTag[String] -> 3) // this won't compile

暗黙的な値 (またはこの場合の変換) を使用して、許可される (キー、値) ペアのインスタンスを指定できることに注意してください。

于 2013-10-28T20:58:02.413 に答える