Scala 强调造成困难的原因
我有下面的代码,假设在数组中搜索,看看是否有与第二个参数匹配的内容Scala 强调造成困难的原因,scala,lambda,functional-programming,set,scala-placeholder-syntax,Scala,Lambda,Functional Programming,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 } 应该这样称呼它: any(集合(3,4,5,6),>5) 但当我称之为: error: missing p
def any(check: Set[Any], expr: Boolean): Boolean = {
var checked = check.filter(_ => expr)
if (checked == Set())
return false
else
return true
}
应该这样称呼它:
any(集合(3,4,5,6),>5)
但当我称之为:
error: missing parameter type for expanded function ((x$1) => x$1.$greater(5))
我对函数式语言和Scala几乎没有经验,所以,请给我一个详细的解释,说明发生了什么以及如何修复它 问题在于计算表达式的时间。在你的电话里
Set(3, 4, 5, 6).exists(_ > 5)
check.filter(_ => expr)
您正在根据传入的表达式的值过滤检查。但在调用中,传递的是函数,而不是布尔值
我认为,您的意思是传递函数,然后在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)
除了@RayToals回答:
如果创建多个参数列表,则可以使用Scalas类型推断:
def any[T](check: Set[T])(test: T => Boolean): Boolean = {
val checked = check.filter(test)
checked.nonEmpty
}
scala> any(Set(3,4,5,6))(_>5)
res6: Boolean = true
scala> any(Set(3,4,5,6))(_>6)
res7: Boolean = false
注意:不要使用return语句(特别是不要显式返回true和false)——大多数情况下它们是不需要的。此外,当您不确定是否需要时,不要使用var
。最后,可以在单个表达式中编写整个方法:
def any[T](check: Set[T])(test: T => Boolean): Boolean =
check.filter(test).nonEmpty
这段代码中对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
来自“expression”,我认为它是一些必须计算的公式。因此,expr
和Boolean
不太可能匹配,这是一些概念问题正在发生的第一个线索
现在,您将\u5
作为expr
参数传递,但\u5
既不是true
也不是false
10>5
为真,3>5
为假,但\U5
是一个函数,函数不是布尔值
我们考虑下划线……代码>5
表示(x)=>x>5
\u>\ u
表示(x,y)=>x>y
,依此类推。如果你不理解下划线,就不要使用它。改为使用完整语法。你以后会理解的,没有必要放慢你的学习速度
现在,我提出这个问题是因为另一个概念问题,这是:
_ => expr
这或多或少相当于z=>expr
,也就是说,一个完全忽略它接收到的参数的函数。请注意,这里下划线的含义与上面不同。事实上,我曾经计算过中下划线的11种不同含义。还有一个在理解下划线之前避免使用下划线的原因
因此,代码的问题在于:
您正在接收一个布尔值
,其中需要一个函数1[Any,Boolean]
在计算是否应该对其进行过滤时,您忽略了正在过滤的元素(我假设这是编译的唯一语法,因为是1)
您传递的函数应为布尔值
现在,即使修复1和2,代码也不会工作,因为\uu6
不是有效的函数1[Any,Boolean]
,因为Any
不实现
我怀疑你来自一个动态的语言背景,使用Any
作为一个快速的“退路”,不必告诉你正在处理的事情是什么类型的。不要这样做——使用Any
并不会让事情变得更容易,反而会让事情变得更难
还有另外两个答案说明了如何正确地编写该方法,我将根据他们的详细情况进行说明。我只想解决一般性的问题,看看我是否能引导您在将来避免此类问题。Oops,这是最后一分钟的编辑,我在布尔型方面也遇到了问题。Scala的类型系统非常强大,不幸的是,有时初学者很难理解,由于错误消息通常没有帮助。非常感谢,回答得很好,关于动态语言的事情你是对的,我来自Ruby和Python:)