采用函数和列表以及 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")
我对 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")