我试图以无形的方式理解单例类型,并面临对单例类型编译时类型的误解。下面是一个例子:
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/