gpt4 book ai didi

scala - 编译时保证 map 对每个枚举案例都有一个键

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

鉴于以下枚举:

enum Connector:
case CHAdeMO
case Mennekes
case CCS
case Tesla
是否有类似 Map[ConnectorType, Int] 的类型但这会产生编译错误:
Map(
Connector.CHAdeMO -> 1,
Connector.Mennekes -> 2,
Connector.CCS -> 3,
)
那就是 map 不包含 Connector.Tesla 的键.换句话说,在编译时类型应该类似于 ((Connector.CHAdeMO, Int), (Connector.Mennekes, Int), (Connector.CCS, Int), (Connector.Tesla, Int))但在其他方面表现得像一个普通的 Map。

最佳答案

这是使用元组( Scastie )的解决方案:

opaque type CheckedMap <: Map[Connector, Int] = Map[Connector, Int]

type Contains[E, T <: Tuple] <: Boolean = T match {
case EmptyTuple => false
case h *: t =>
h match {
case (E, _) => true
case _ => Contains[E, t]
}
}

type ContainsAll[S <: Tuple, T <: Tuple] = S match {
case EmptyTuple => DummyImplicit
case h *: t =>
Contains[h, T] match {
case true => ContainsAll[t, T]
case false => Nothing
}
}

type AllConnectors = (
Connector.CHAdeMO.type,
Connector.Mennekes.type,
Connector.CCS.type,
Connector.Tesla.type
)

def checkedMap[T <: Tuple](t: T)(using
@annotation.implicitNotFound(
"Not all Connector types given."
) c: ContainsAll[AllConnectors, T]
): CheckedMap = t.toList.asInstanceOf[List[(Connector, Int)]].toMap
这将需要一个元组元组 (Connector, Int)并检查它是否包含所有 Connector 的另一个元组中的所有类型类型。如果输入包含所有连接器类型至少一次,它会查找隐式 DummyImplicit ,否则,它会寻找一个隐含的 Nothing ,它显然没有找到。由此产生的错误消息非常冗长且无益,因此我输入了自定义错误消息。请注意,这不会检查是否存在重复键,但可以对其进行简单的修改。
不幸的是,我发现自己必须在使用站点显式注释键值对的类型:
//Errors because Tesla is missing
checkedMap(
(
Connector.CHAdeMO -> 1: (Connector.CHAdeMO.type, Int),
Connector.Mennekes -> 2: (Connector.Mennekes.type, Int),
Connector.CCS -> 3: (Connector.CCS.type, Int)
)
)
//Valid
checkedMap(
(
Connector.CHAdeMO -> 1: (Connector.CHAdeMO.type, Int),
Connector.Mennekes -> 2: (Connector.Mennekes.type, Int),
Connector.CCS -> 3: (Connector.CCS.type, Int),
Connector.Tesla -> 4: (Connector.Tesla.type, Int)
)
)

关于scala - 编译时保证 map 对每个枚举案例都有一个键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68876829/

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