Scala高阶函数编译错误

时间:2017-08-24 15:24:33

标签: scala

我正在学习Scala申请和更高阶的功能。我有这个编码,但为什么编译器给了我一个错误:"缺少参数类型",如何修复它?

import scala.collection.mutable.ListBuffer

object MyArr {
  var mList1 = ListBuffer[Int]()

  def filter(p: Int => Boolean): List[Int] = {
    val mList = List[Int]()
    for (x <- mList1) {
      if (p(x)) x :: mList
    }
    mList
  }

  def apply(x: Array[Int]) = {
    for (y <- x) mList1 += y
  }
}

def isEven(x: Int): Boolean = {
  x % 2 == 0
}

var mCustomArr = MyArr(Array(1, 2, 3, 4))
mCustomArr.filter(x => isEven(x)).foreach(println)

如果apply方法只接受一个参数并将其添加到mList1,它将起作用。为什么?

感谢

2 个答案:

答案 0 :(得分:0)

在apply方法中,它更新Object中的mList1并返回Unit。所以变量mCustomArr将是单元类型。

如果您想使用过滤方法,则需要像object MyArr { var mList1 = ListBuffer[Int]() def filter(p: Int => Boolean): ListBuffer[Int] = { val mList = ListBuffer[Int]() for (x <- mList1) { if (p(x)) mList += x } mList } def apply(x: Array[Int]) = { for (y <- x) mList1 += y } } 一样使用MyArr对象。

但是当我研究你的filter方法的实现时,它看起来像mList里面的方法永远不会改变。我认为过滤方法可以像

一样实现
{{1}}

希望您乐意学习Scala,干杯。

答案 1 :(得分:0)

如果您已将返回类型添加到apply()定义,则编译器会准确指出错误的位置。

def apply(x: Array[Int]): ListBuffer[Int] = {
  for (y <- x) mList1 += y
  mList1
}