gpt4 book ai didi

scala - 对无形 HList 的内容进行类型推断

转载 作者:行者123 更新时间:2023-12-04 23:22:02 24 4
gpt4 key购买 nike

此示例已简化。

我有一组这样的类(class):

case class KeyMapping[KeyType](k:KeyType)

class WrappedMapping[KeyType](m:T forSome {type T <: KeyMapping[KeyType]}) {
val k:KeyType = ???
}

在以下代码中,正确推断了类型:
 val w = new WrappedMapping(KeyMapping("key"))

//The statement below gives the correct error
//type mismatch;
// found : w.k.type (with underlying type String) required: Nothing
//val test1:Nothing = w.k

我不知道如何正确推断以下类型:
class Mappings[KeyType, L <: HList](mappings:L) {
val k:KeyType = ???
}

val m = new Mappings(KeyMapping("key1") :: KeyMapping("key2") :: HNil)

// should not compile, k should be of type String
val test2:Nothing = m.k

有什么方法可以推断 KeyType基于 HList 的内容?

最佳答案

Shapeless 提供了 ToList毫不奇怪,它用于将 HLists 转换为 Lists。

为此,它必须首先计算 HList 中类型的 LUB(最小上限),这是您可以使用的:

import shapeless.ops.hlist.ToList

class Mappings[L <: HList, Lub](mappings:L)(implicit toList: ToList[L, Lub]) {
...
}
L进入,隐式解析发现了一个(也是唯一的)有效 ToList受该约束的实例 L , Lub拉出的类型。

但这还不够,因为 Lub将是 KeyMapping[String] ,而您想要的只是 String部分。与 shapeless 一样,解决方案是添加另一个隐式:
class Mappings[L <: HList, Lub, KeyType](mappings:L)(
implicit
val toList: ToList[L, Lub],
val kt: Lub <:< KeyMapping[KeyType]
) {
val k: KeyType = null.asInstanceOf[KeyType]
}

(隐含不需要是 val s,但如果它们是当您在 REPL 中探索事物时会有所帮助)

这断言的是 Lub对应类型 KeyMapping[KeyType] (例如,它是一个子类型或完全相同的类型),其中 KeyType目前还不得而知。同样,对于指定的约束只有一种有效的解决方案,即 KeyType参数被拉出为 String .

我不知道你打算如何实现 k ,但您可能会发现拥有 toList实例可以帮助您这样做,因为它允许您现在调用 mappings.toList

关于scala - 对无形 HList 的内容进行类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21826845/

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