下划线造成困难
我有下面的代码,它应该搜索数组,并查看是否有任何匹配的第二个参数。
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是一个Boolean 。 Boolean是true或false - 它不能是其他任何东西。 另一方面, expr来自“表达”,我认为这是一些必须评估的公式。 因此, expr和Boolean不太可能匹配,这是一些概念问题正在进行的第一条线索。
现在,您将_ > 5作为expr参数传递,但_ > 5既不是true也是false 。 10 > 5是正确的, 3 > 5将是错误的,但_ > 5是一个函数,并且函数不是Boolean 。
让我们考虑下划线...... _ > 5意味着(x) => x > 5 。 _ > _表示(x, y) => x > y ,依此类推。 如果你不理解下划线,请不要使用它。 改用完整的语法。 你会在以后获得理解,不需要拖慢你的学习速度。
现在,由于另一个概念问题,我提出这个问题,这就是:
_ => expr
这或多或少等同于z => expr ,即完全忽略它所接收的参数的函数。 请注意,此处下划线的含义与上面的不同。 事实上,在这个答案中,我曾经为下划线计算了11种不同的含义 。 在理解它们之前避免使用下划线的另一个理由。
所以,你的代码的问题是:
Boolean ,你想要一个Function1[Any, Boolean] 。 Boolean 。 现在,即使修复1和2,代码也不会工作,因为_ > 6不是有效的Function1[Any, Boolean] ,因为Any不执行> 。
我怀疑你来自动态语言背景,并使用Any作为快速“后备”,不必告诉你正在处理的事物是什么类型。 不要这样做 - 使用Any不会让事情变得更容易,这会让事情变得更加困难。
还有两个其他答案显示了如何正确编写该方法,并且我会按照他们的具体情况进行说明。 我只想解决一般问题,看看我能不能指导你在将来避免这些问题。
链接地址: http://www.djcxy.com/p/72837.html