gpt4 book ai didi

scala - Scala 中 Map 键和值类型参数之间的依赖关系

转载 作者:行者123 更新时间:2023-12-04 17:21:32 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Relating parameterized types

(4 个回答)


7年前关闭。




有时,对映射中的键和值类型之间的依赖关系进行编码可能很有用。考虑以下类型:

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

这里序列中的每一对应该具有相同的类型 T .但是这种类型在类似 map 的使用方面不是很方便。但是我无法表达对 Map[K, V] 的这种依赖。 , 因为 Map有两个独立的类型参数,似乎我无法以任何方式将它们“分组”以使用单个存在类型。天真的变体
type MyMap = Map[TypeTag[T], T] forSome {type T}

只是强制单一类型 T .所有 MyMap条目,但不是针对每个条目单独进行的。

我认为另一个极端是
type MyMap = Map[TypeTag[_], _]

但这当然是一个过于宽泛的定义,它允许键值类型的任意组合。

所以我的问题是,可以在 Scala 中对这种类型进行编码吗?如果是,如何?

最佳答案

正如其他人指出的那样,您需要使用异构映射。无形项目有一个实现:

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

请注意,您可以使用隐式值(或在我们的示例中进行转换)来指定允许的 (key, value) 对实例。

关于scala - Scala 中 Map 键和值类型参数之间的依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19250245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com