简体   繁体   English

scalaz-类型不匹配

[英]scalaz - type mismatch

I am facing 'type mismatch' issue, I tried more than two hours even not resolved because I am not good in scala. 我遇到“类型不匹配”的问题,我尝试了两个多小时,甚至没有解决,因为我在scala上并不擅长。

Using: Scala 2.11.7 使用: Scala 2.11.7

Error: 错误:

[error] AlertUUU.scala:297: type mismatch;
[error]  found   : scalaz.Validation StartTimeOverlap.type, OnPeakRange]
[error]  required: scalaz.Validation[String,OnPeakRange]
[error]       p.onPeakRanges.find(x ⇒ opr.startTime >= x.startTime && opr.startTime <= x.stopTime).map

(_.startTimeOverlap).getOrElse(opr.success) (_.startTimeOverlap).getOrElse(opr.success)

Code: 码:

  def startTimeMustNotOverlap(p: UUUPeriod, opr: OnPeakRange): Validation[String, OnPeakRange] =
  p.onPeakRanges.find(x ⇒ opr.startTime >= x.startTime && opr.startTime <= x.stopTime).map(_.startTimeOverlap).getOrElse(opr.success)


case class OnPeakRange(
                        startTime: Int,
                        stopTime: Int,
                        originalThreshold: Int) extends OnPeakRangeT with OnPeakRangeValidations {
  def startTimeOverlap = OnPeakRange.StartTimeOverlap.failure
  def stopTimeOverlap = OnPeakRange.StopTimeOverlap.failure
  def allHoursPeakNotFullDay = OnPeakRange.AllHoursPeakNotFullDay.failure
}

case object StartTimeOverlap extends ValidationKey

trait ValidationKey {
  def failNel = this.toString.failureNel
  def nel = NonEmptyList(this.toString)
  def fail = this.toString.failure
}

The error explains everything, startTimeMustNotOverlap should return a Validation[String, OnPeakRange] . 该错误说明了所有内容, startTimeMustNotOverlap应该返回Validation[String, OnPeakRange]

Your Success case is of type OnPeakRange , your Failure type is of case OnPeakRange.StartTimeOverlap instead of a String . 您的Success案例的类型为OnPeakRange ,您的Failure案例的类型为OnPeakRange.StartTimeOverlap而不是String

You have to just change the type of startTimeOverlap to String or change the Validation type. 您只需将startTimeOverlap的类型更改为String或更改Validation类型。


def startTimeMustNotOverlap(p: Period, opr: OnPeakRange): Validation[String, OnPeakRange] =
  p.onPeakRanges.find(
    x => opr.startTime >= x.startTime && opr.startTime <= x.stopTime
  ).fold(opr.success[String])(_.startTimeOverlap)

case class Period(onPeakRanges: List[OnPeakRange] = Nil)
case class OnPeakRange(startTime: Int, stopTime: Int){
  def startTimeOverlap = "...".failure
}

I changed 我变了

def startTimeOverlap = OnPeakRange.StartTimeOverlap.failure

to

def startTimeOverlap = OnPeakRange.StartTimeOverlap.fail

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM