我对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
}
有人可以解释其背后的概念或实施方法。
答案 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")