我尝试这段简短的代码片段,尝试使用精炼库(https://github.com/fthomas/refined)中的Positive类型来约束Integer类型。
package xxx
import eu.timepit.refined._
import eu.timepit.refined.api.{Refined, Validate}
import eu.timepit.refined.auto._
import eu.timepit.refined.numeric._
import eu.timepit.refined.api.Refined
import eu.timepit.refined.numeric.Interval
object Lala {
type X = Integer Refined Positive
def lala(x: Int): Unit = {
val lala: X = refineV[X](x)
}
}
编译此代码段时,收到以下错误消息:
错误:(13,29)找不到参数v的隐含值:eu.timepit.refined.api.Validate [Int,xxx.Lala.X] val lala:X = refineVX
错误:(13,29)没有足够的方法适用于方法:(隐式v:eu.timepit.refined.api.Validate [Int,xxx.Lala.X])[String,eu.timepit.refined。在RefinePartiallyApplied类中的api.Refined [Int,xxx.Lala.X]]。 未指定的值参数v。 val lala:X = refineVX
似乎缺少Positive类型的Validate实现。我想知道是否有人可以帮我找到Positive类型的Validate特征的实例?或者我应该自己提供这样的实例?
答案 0 :(得分:4)
快速查看Refined readme中的类似示例应该有助于解决您的问题:
import eu.timepit.refined._
import eu.timepit.refined.api.Refined
import eu.timepit.refined.auto._
import eu.timepit.refined.numeric._
// Int instead of Integer
type X = Int Refined Positive
// refineV returns an Either[String, SomeType Refined Tag]
// (and uses a Validate[SomeType, Tag])
def foo(x: Int): Either[String, X] = refineV[Positive](x)
foo(5) // Either[String,X] = Right(5)
foo(-1) // Either[String,X] = Left(Predicate failed: (-1 > 0).)