首页 > 解决方案 > Shapeless Witness 以及它如何提供实际的单例类型

问题描述

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

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

它工作正常,但这种结构看起来很不寻常。是什么Witness.120?在 IDE 中它指向一些宏函数selectDynamic

def selectDynamic(tpeSelector: String): Any = macro SingletonTypeMacros.witnessTypeImpl

它具有编译时类型并通过构造a memberAny来判断。这看起来很神奇......当一个人写下类似的东西时,任何人都可以对实际发生的事情给出一些解释:Witness.120.TtypeT

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

标签: scalageneric-programmingshapelesstype-level-computation

解决方案


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

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

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

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

由于Scala 2.13 文字类型已集成到该语言中,因此您可以将其简单地编写为:

def f(x: 120) = x

函数将值的类型从一般narrow缩小到文字。120Int120


推荐阅读