在以下示例中
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)
我收到错误
错误:找不到参数
的隐含值witness:shapeless.Witness.Aux[String("right")]
我正在尝试做的事情是类型级DSL,它严重依赖单例类型。
由于在typelevel的fork之外支持单例类型的文字,我希望除了类型文字之外还要开发基于值的DSL,并且在值类型中保留可用的单例类型对于此任务至关重要。
所以我正在寻找允许我稍后从值的类型中提取单例字符串见证的任何解决方法。
使用.witness
代替.narrow
的操作完美无缺,但我仍然在寻找没有Witness
包裹的纯类型的解决方案
答案 0 :(得分:5)
这是类型推断的失败......你会发现,
Briques b = brique[i][j];
将按预期工作。
这并不是特别有用,因为我想你想要从值参数推断出单身类型extract[concat.type](concat)
。 shapeless提供了对extract
类型的隐式转换,因此以下内容可能适用于您的上下文,
Witness
这将接受文字def extract(witness: Witness.Lt[String]): String = witness.value
和缩小的值。