无形窄型损失
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
和缩小的值。
在下面的例子中
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
和缩小的值。