获取函数和列表并返回布尔值的函数

时间:2018-01-02 20:44:58

标签: scala functional-programming scala-collections

我对Scala函数式编程比较陌生。我一直在执行一些任务,但发现难以理解或实施以下概念。

基本上,我想写一个带有列表和函数的函数,如果函数至少返回一个函数,则返回true 列表中的项目。一个例子是:hasMatch(isEven,List(1,2,3,5))将返回true,但hasMatch(isEven,List(1,3,5))将返回false。

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

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

有人可以解释其背后的概念或实施方法。

3 个答案:

答案 0 :(得分:1)

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

exists函数具有与之后相同的语义 - 如果fn对于至少一个元素返回true,则返回true,否则返回false。

答案 1 :(得分:1)

你的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))

答案 2 :(得分:1)

你的实现最大的问题: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")