Могу ли я заставить определенные ключи на карте иметь определенные типы в scala? - PullRequest
0 голосов
/ 24 мая 2019

Например, я знаю, что во время выполнения у меня будут только следующие ключи: string-key-1, number-key-1.

Я могу создать карту ключа к введенному значению так:

sealed trait Container {
  type T

  def resolve: T = this match {
    case StringContainer(s) => s.asInstanceOf[String]
    case BigDecimalContainer(n) => n.asInstanceOf[BigDecimal]
    // and more
  }
}


final case class StringContainter(v: String) { type T = String } 
final case class BigDecimalContainer(v: BigDecimal) { type T = BigDecimal } 

Тогда я мог бы применять такие типы:

Map[String, Container]

Но для этого все же требуется, чтобы клиент знал, что тип string-key-1 не может отображаться на BigDecimalContainer. Есть ли способ создать логику, которая внутренне отображает кортежи (key, container type) => value? Некая неявная функция предиката, вероятно, то, что мне нужно, нет?

1 Ответ

5 голосов
/ 24 мая 2019

Вы можете использовать бесформенный hmap :

class KeyToValue[K, V]
case class StringKey(key: String)
case class IntKey(key: String)
implicit val keyToString = new KeyToValue[StringKey, String]
implicit val keyToInt = new KeyToValue[IntKey, Int]

val map = HMap[KeyToValue](
    StringKey("string-key") -> "string-value",
    IntKey("int-key") -> 0
)

val stringValueOption = map.get(StringKey("string-key")) //will be Some("string-value")
val intValueOption = map.get(IntKey("int-key")) //will be Some(0)
...