【问题标题】:Why are my Scala types not matching?为什么我的 Scala 类型不匹配?
【发布时间】:2010-12-13 06:25:55
【问题描述】:

我有以下变量series

var series: List[FlotSerie] = List(
  new FlotSerie() {
    override val label = Full("Min")
  },
  new FlotSerie() {
    override val label = Full("Max")
  },
  new FlotSerie() {
    override val label = Full("Avg")
  }
)

不幸的是,我在使用以下方法时遇到编译器错误,该方法采用新数据点并根据新数据和旧系列将 series 更新为新的 List[FlotSeries]

def updateSeries(sample: Sample): List[FlotSerie] = {
  series = series.map(serie =>
    serie match {
      case item if item.label == Full("Min") => {
        new FlotSerie() {
          override val label = item.label
          override val data = (sample.timestamp.toDouble, sample.min) :: serie.data
        }
      }
      case item if item.label == Full("Max") => {
        new FlotSerie() {
          override val label = item.label
          override val data = (sample.timestamp.toDouble, sample.max) :: serie.data
        }
      }
      case item if item.label == Full("Avg") => {
        new FlotSerie() {
          override val label = item.label
          override val data = (sample.timestamp.toDouble, sample.avg) :: serie.data
        }
      }
    }
  )
}

Scala 编译器在重新分配时阻塞,因为它发现类型不匹配:

error: type mismatch;
found   : Unit
required: List[net.liftweb.widgets.flot.FlotSerie]
   series = series.map(serie => serie match {

我在这里做错了什么?它似乎应该返回一个可以分配给series 的 List[FlotSeries]。既然编译器找到了Unit,我就想到了foreach怎么总是返回Unit,但是match操作符返回的是匹配表达式的最后一个值,而不是Unit

【问题讨论】:

    标签: scala types flot lift


    【解决方案1】:

    Scala 中的赋值返回 Unit(又名 Scala 不完全为 null),这与 Ruby 返回分配的值不同。您的方法试图返回 Unit 而不是 List[FlotSerie]。

    添加:

    return series
    

    到您的方法,或将其更改为返回单位。

    如果合适的话,您还可以使用案例类和适当的匹配来简化您的代码:

      case class FlotSerie(label:Full, data:List[Tuple2[Double, Double]])
      var series: List[FlotSerie] = List( FlotSerie(Full("Min"), Nil), FlotSerie(Full("Max"), Nil), FlotSerie(Full("Avg"), Nil) )
    
      def updateSeries(sample: Sample): List[FlotSerie] = {
        series = series.map(serie => {
          serie.label match {
            case Full("Min") => FlotSerie(serie.label, (sample.timestamp.toDouble, sample.min) :: serie.data)
            case Full("Max") => FlotSerie(serie.label, (sample.timestamp.toDouble, sample.max) :: serie.data)
            case Full("Avg") => FlotSerie(serie.label, (sample.timestamp.toDouble, sample.avg) :: serie.data)
          }
        })
        return series
      }
    

    我自己对 Scala 还是很陌生,所以 YMMV。

    【讨论】:

    • 谢谢,Alex,类型错误并没有让我清楚地知道问题不在于我的映射,而在于方法的返回值。感谢您提醒我作业返回 Unit。我希望它返回分配的值!
    • 我曾经遇到过我希望它返回分配值的情况,但后来我完全停止使用 var 并进行功能性编程,我更开心:) 原因可能与避免 = vs == 错误,并且可能有一些语法限制会放在语言的其他部分。
    【解决方案2】:

    删除 series = 您已将 map 函数分配给系列并且不返回任何内容。

    【讨论】:

      猜你喜欢
      • 2021-06-27
      • 1970-01-01
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 2022-01-26
      • 1970-01-01
      相关资源
      最近更新 更多