scala - 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.T
type
T
val x: Witness.`120`.T = //...
解决方案
Witness
创建一个所谓的基于文字的单例类型。文字类型意味着它是一种只能接受一个值的类型。
因此,如果您创建这样的函数:
def f(x: Witness.`120`.T) = x
它只接受整数120
,但不接受121
。
由于Scala 2.13 文字类型已集成到该语言中,因此您可以将其简单地编写为:
def f(x: 120) = x
函数将值的类型从一般narrow
缩小到文字。120
Int
120
推荐阅读
- neo4j - Neo4j - 中间节点有关系的最短路径
- asp.net-web-api - 在从 Angular 6 调用 ASP.NET Core Web API 的服务器异常上获取 CORS 错误 *only*
- oracle - oracle db current_date 返回 java.sql.Timestamp,而不是 java.sql.Date
- asp.net-mvc - 以错误的顺序捆绑加载脚本
- php - 从配置变量连接到 sql 导致错误(php 代码)
- php - 致命错误:cpanel 中的数据库错误
- git - Git状态在cygwin中挂起
- awk - awk 用字符串删除行...如果字符串包含行返回怎么办?
- android - 安卓短信广播接收器
- delphi - 德尔福 10.2.3 和 iOS 9