下划线造成困难
我有下面的代码,它应该搜索数组,并查看是否有任何匹配的第二个参数。
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