采用函数和列表以及 returns 布尔值的函数

Function that takes a function and list and returns Boolean

我对 Scala 函数式编程比较陌生。然而,我一直在关注一些任务,发现很难理解或实施下面的概念。

基本上,我想写一个函数,它接受一个列表和一个函数,如果函数 return 至少有一个为真,则 return 为真 列表中的项目。例如:hasMatch(isEven,List(1,2,3,5)) 将 return 为真,但 hasMatch(isEven,List(1,3,5)) 将 return 为假。

问题提供了示例解决方案或提示,如下所示:

def hasMatch (fn:(Int)=>Boolean,lst:List[Int]):Boolean = {
    lst.foreach ((x:Int) => if (fn(x)) return true)
return false
}

谁能解释一下它背后的概念或实现它的方法。

def hasMatch(fn: Int => Boolean, lst: List[Int]): Boolean = lst.exists(fn)

exists 函数与您所追求的具有相同的语义 - 如果 fn returns 至少有一个元素为真,则 returns 为真,否则为假。

您的 isEven 函数将确定 hasMatch 函数的结果。因此,假设您的 isEven 函数定义如下:

def isEven(x: Int): Boolean = x % 2 == 0

您现在可以像这样定义 hasMatch 函数:

def hasMatch(fn: Int => Boolean, l: List[Int]): Boolean = {
  l.exists(elem => fn(elem))
}

然后您可以这样调用该函数:

hasMatch(isEven, List(1,2,3,5))

你的实现的最大问题:return 在 Scala 中是一个非常糟糕的东西,并且(几乎)不应该被使用。

此外,还有更多惯用的方法来做你想做的事,而不是用 foreach 拼出命令式循环。

这是一种可能性:

  def hasMatch[T](lst: List[T])(fn: T => Boolean) = lst.exists(fn)

我在您的定义中添加了一个类型参数,因此它适用于任何类型,而不仅仅是 Int。此外,我将 fn 作为最后一个参数,并将其移至单独的列表中。它使得传递匿名函数变得更容易:

  if (hasMatch(List(1,2,3,4,5)) { _ > 5 }) println("There are elements greater than five")