下划线造成困难

我有下面的代码,它应该搜索数组,并查看是否有任何匹配的第二个参数。

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

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

但是当我称之为:

error: missing parameter type for expanded function ((x$1) => x$1.$greater(5))

我对函数式语言和Scala很少有经验,所以请给我一个关于正在发生的事情以及如何解决它的全面解释!


该问题是您评估表达式的时间之一。 在你的电话中

check.filter(_ => expr)

你过滤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
}

现在你可以这样调用它:

any(Set(3, 4, 5, 6), (_:Int) > 5)

Set(3, 4, 5, 6).exists(_ > 5)

在这段代码中有一些关于Scala的误解。 第一个需要解决的问题是:

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

any(Set(3, 4, 5, 6), _ > 5)

首先, expr是一个BooleanBooleantruefalse - 它不能是其他任何东西。 另一方面, expr来自“表达”,我认为这是一些必须评估的公式。 因此, exprBoolean不太可能匹配,这是一些概念问题正在进行的第一条线索。

现在,您将_ > 5作为expr参数传递,但_ > 5既不是true也是false10 > 5是正确的, 3 > 5将是错误的,但_ > 5是一个函数,并且函数不是Boolean

让我们考虑下划线...... _ > 5意味着(x) => x > 5_ > _表示(x, y) => x > y ,依此类推。 如果你不理解下划线,请不要使用它。 改用完整的语法。 你会在以后获得理解,不需要拖慢你的学习速度。

现在,由于另一个概念问题,我提出这个问题,这就是:

_ => expr

这或多或少等同于z => expr ,即完全忽略它所接收的参数的函数。 请注意,此处下划线的含义与上面的不同。 事实上,在这个答案中,我曾经为下划线计算了11种不同的含义 。 在理解它们之前避免使用下划线的另一个理由。

所以,你的代码的问题是:

  • 你正在接收一个Boolean ,你想要一个Function1[Any, Boolean]
  • 在计算是否应该过滤时,你忽略了被过滤的元素(我假设因为这是编译的唯一语法,因为1)。
  • 你正在传递一个函数,它是一个Boolean
  • 现在,即使修复1和2,代码也不会工作,因为_ > 6不是有效的Function1[Any, Boolean] ,因为Any不执行>

    我怀疑你来自动态语言背景,并使用Any作为快速“后备”,不必告诉你正在处理的事物是什么类型。 不要这样做 - 使用Any不会让事情变得更容易,这会让事情变得更加困难。

    还有两个其他答案显示了如何正确编写该方法,并且我会按照他们的具体情况进行说明。 我只想解决一般问题,看看我能不能指导你在将来避免这些问题。

    链接地址: http://www.djcxy.com/p/72837.html

    上一篇: Underscore Causing Difficulties

    下一篇: what this scala symbol