无形窄型损失

Odo*_*ois 4 scala shapeless singleton-type

在以下示例中

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)
Run Code Online (Sandbox Code Playgroud)

我收到了一个错误

错误:找不到参数的隐含值 witness:shapeless.Witness.Aux[String("right")]

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

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

编辑

操作使用.witness而不是.narrow完美地工作,但我仍然在寻找纯粹类型的解决方案,而不需要Witness包装

Mil*_*bin 5

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

extract[concat.type](concat)
Run Code Online (Sandbox Code Playgroud)

将按预期工作.

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

def extract(witness: Witness.Lt[String]): String = witness.value
Run Code Online (Sandbox Code Playgroud)

这将接受字面值Strings和缩小值.