下划线导致困难

Bob*_*les 0 lambda functional-programming scala set scala-placeholder-syntax

我有以下代码,它应该搜索数组并查看是否与第二个参数匹配.

def any(check: Set[Any], expr: Boolean): Boolean = {
  var checked = check.filter(_ => expr)
  if (checked == Set())
    return false
  else
    return true
}
Run Code Online (Sandbox Code Playgroud)

它应该被称为这样: any(Set(3, 4, 5, 6), _ > 5)

但是当我打电话给它时:

error: missing parameter type for expanded function ((x$1) => x$1.$greater(5))
Run Code Online (Sandbox Code Playgroud)

我对函数式语言和Scala的经验很少,所以,请给我一个彻底的解释,说明发生了什么以及如何解决它!

Ray*_*oal 6

问题是您评估表达式的时间之一.在你的电话里

check.filter(_ => expr)
Run Code Online (Sandbox Code Playgroud)

你是check通过传入的表达式的来过滤的.但是在你的调用中,你传递的是一个函数,而不是一个布尔值.

我认为你的意思是通过这个功能,然后在你的check通话中评估它.例如:

def any[T](check: Set[T], test: T => Boolean): Boolean = {
  var checked = check.filter(test)
  if (checked == Set())
    return false
  else
    return true
}
Run Code Online (Sandbox Code Playgroud)

现在你可以这样调用如下:

any(Set(3, 4, 5, 6), (_:Int) > 5)
Run Code Online (Sandbox Code Playgroud)