从 Refined 获取谓词

Getting predicate from Refined

是否可以在运行时从 Refined 变量的 predicate/witness 中提取边界?类似于以下内容。

// Should return L as a Double
def getLowerBound[L, H](v: Refined[Double, Interval.Closed[L, H]]): Double = ???

val v: Refined[Double, Interval.Closed[0.5, 1.0]] = 0.94
val lowerBound = getLowerBound(v)
lowerBound shouldBe 0.5

你可以使用类型绑定告诉编译器L将是一个Double,然后使用ValueOf typeclass来提取文字类型的值;像这样:

def getLowerBound[L <: Double, H](v: Refined[Double, Interval.Closed[L, H]])
                                 (implicit ev: ValueOf[L]): Double =
  ev.value

可以看到代码运行 here.