scala - Shapeless Witness 以及它如何给出实际的单例类型

标签 scala generic-programming shapeless type-level-computation

我试图以无形的方式理解单例类型,并面临对单例类型编译时类型的误解。下面是一个例子:

val x: Witness.`120`.T = 120.narrow

它工作正常,但这种结构看起来很不寻常。什么是Witness.120 ?在IDE中它指向一些宏函数 selectDynamic :
def selectDynamic(tpeSelector: String): Any = macro SingletonTypeMacros.witnessTypeImpl

具有编译时类型 Any并从结构来看Witness.120.T type成员(member)T .这看起来很神奇......当一个人写下这样的东西时,任何人都可以解释一下实际发生的事情:
val x: Witness.`120`.T = //...

最佳答案

Witness创建所谓的基于文字的单例类型。文字类型意味着它是一种只能接受一个值的类型。

因此,如果您创建这样的函数:

def f(x: Witness.`120`.T) = x

它只接受整数 120 ,但不是 121 .

斯卡拉 2.13 literal types已集成到语言中,因此您可以简单地将其编写为:
def f(x: 120) = x

功能 narrow缩小值的类型 120来自一般 Int文字 120 .

关于scala - Shapeless Witness 以及它如何给出实际的单例类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59354968/

相关文章:

scala - 多个 Futures in Play 和使用案例类来保存 future 数据

scala - 在 spark 中遍历每一列并找到最大长度

c++ - 可调用(回调)模板作为类模板参数

c++ - 在 C++ 中推断 lambda 的模板类型

scala - 如何定义一个 HList 类型,但基于另一个 HList 类型

function - Scala通用函数值(匿名函数)-缺少参数类型(错误)

Scala SocketServer

c++ - 模板函数作为模板参数

scala - 与不同类型但相同标签的无形状对齐

scala - Shapeless 是否使用反射,在 Scala 生产代码中使用是否安全?