无形窄型损失

Shapeless narrow type loss

在下面的例子中

import shapeless._
import shapeless.syntax.singleton._

val concat = "right".narrow

def extract[s <: String](x: s)(implicit witness: Witness.Aux[s]): String = witness.value

extract(concat)

我收到一个错误

Error: could not find implicit value for parameter witness:shapeless.Witness.Aux[String("right")]

我正在尝试做的是类型级别的 DSL,它严重依赖单例类型。

由于单例类型文字在 typelevel 的分叉之外受到严重支持,我希望除了类型文字之外还开发基于值的 DSL,并且在值类型中保留可用的单例类型对于此任务至关重要。
所以我正在寻找任何变通方法,它允许我稍后从值的类型中提取单例字符串见证。

编辑

使用 .witness 而不是 .narrow 的操作运行良好,但我仍在寻找没有 Witness 包装

的纯类型的解决方案

这是类型推断的失败……你会发现,

extract[concat.type](concat)

将如您所愿。

这不是特别有用,因为我想你想从 extract 的值参数推断单例类型。 shapeless 提供到 Witness 类型的隐式转换,因此以下内容可能适用于您的上下文,

def extract(witness: Witness.Lt[String]): String = witness.value

这将接受文字 Strings 和缩小的值。