使用精确约束“Positive”编译错误

时间:2016-12-14 20:11:09

标签: scala

我尝试这段简短的代码片段,尝试使用精炼库(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特征的实例?或者我应该自己提供这样的实例?

1 个答案:

答案 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).)