【问题标题】:scalaz - type mismatchscalaz - 类型不匹配
【发布时间】:2017-03-31 08:16:42
【问题描述】:

我正面临“类型不匹配”问题,我尝试了两个多小时甚至没有解决,因为我不擅长 scala。

使用: Scala 2.11.7

错误:

[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)

代码:

  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
}

【问题讨论】:

  • 您能否详细说明您的数据结构? OnPeakRangeUdmPeriod.
  • 我都添加了需要字段。
  • 更新了我的答案以应对...

标签: scala scalaz


【解决方案1】:

错误说明了一切,startTimeMustNotOverlap 应该返回 Validation[String, OnPeakRange]

您的 Success 大小写是 OnPeakRange 类型,您的 Failure 类型是大小写 OnPeakRange.StartTimeOverlap 而不是 String

您只需将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
}

【讨论】:

  • 对不起@Federico,我试过了,但即使我也遇到了同样的问题[错误]:scalaz.Validation[OnPeakRange.StartTimeOverlap.type,Nothing] [error] required: scalaz.Validation[String,OnPeakRange ] [错误] p.onPeakRanges.find(x ⇒ opr.startTime >= x.startTime && opr.startTime
【解决方案2】:

我变了

def startTimeOverlap = OnPeakRange.StartTimeOverlap.failure

def startTimeOverlap = OnPeakRange.StartTimeOverlap.fail

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多