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:)