Scala:“;任何”;和“;全部”;功能

Scala:“;任何”;和“;全部”;功能,scala,functional-programming,Scala,Functional Programming,我的Haskell*有点生锈,所以我可以想象我错过了显而易见的: def any[A](s: Traversable[A], f: A => Boolean): Boolean = { s.foldLeft(false)((bool, elem) => bool || f(elem)) } 这些属性之一是否适用于it 在Scala libs中的某个地方预定义 间接的,写得更快的一行 错(对不起,我没有测试它) *实际上是SML,但99%是一样的,但在太阳底下没有人知道 不

我的Haskell*有点生锈,所以我可以想象我错过了显而易见的:

def any[A](s: Traversable[A], f: A => Boolean): Boolean = {
    s.foldLeft(false)((bool, elem) => bool || f(elem))
}
这些属性之一是否适用于it

  • 在Scala libs中的某个地方预定义
  • 间接的,写得更快的一行
  • 错(对不起,我没有测试它)

  • *实际上是SML,但99%是一样的,但在太阳底下没有人知道

  • 不,它不是用那些名字预先定义的。您可以使用可遍历包中的
    exists
  • 您的实现的最大缺点是,对于
    any
    ,如果any为true,if已经可以给出您的答案,则需要消耗所有可遍历的代码。这同样适用于
    all
    。但是可以很容易地实现它,这样它就不会评估整个序列。另一个解决方案是为这种类型的操作实现monad。然后你会打电话:

    a和b以及c
    相当于
    a和(b)以及(c)

  • 这是正确的


  • 顺便说一句,我发现缺少的另一个函数是
    sum
    函数。

    那么
    exists
    呢:

    scala> List(1,2,3).exists(_ > 2)
    res12: Boolean = true
    

    它是打开的。

    方法存在于可遍历特征上,相当于
    any
    all

    def all[A](xs: Traversable[A], p: A => Boolean): Boolean = xs forall p
    
    def any[A](xs: Traversable[A], p: A => Boolean): Boolean = xs exists p
    
  • 它是预定义的,称为
    exists
    。而
    forall
    将是您正在寻找的“all”函数

    scala> Vector(3, 4, 5).exists(_ % 2 == 0)
    res1: Boolean = true
    
    scala> Vector(3, 4, 5).forall(_ % 2 == 0)
    res2: Boolean = false
    
  • 您可以使用带有
    中断的
    for
    循环(从
    scala.util.control.Breaks
    )来提高性能。(请参阅
    存在的标准库实现
    的所有

  • 没错


  • 如果你认为Haskell是99% SML,你要么没有达到Maad,要么根本的原则比实际代码看起来和工作方式要高(例如你也会考虑java 99% C++)。Haskell或SML是如何与这个问题相关的(也许我忽略了明显的),假设99%的SML在Haskell;我记得用SML写过类似的(=函数)代码。这就是为什么我对函数编程并不完全陌生,而且在必须将一个函数作为参数传递给另一个函数时也不会感到不安)Haskell和SML是完全不同的,因为Haskell在默认情况下是懒惰的。谢谢,只要Stackoverflow允许我这样做,我就会接受这个。再次感谢您提前退出的提示。一个如何优雅地完成它的想法?和
    someTraversable.reduceEleft(+\uu)
    someTraversable.sum
    有点笨拙,但我认为不值得定义一个函数(不像
    any
    all
    ,它们看起来有点长)。请注意,我也想在
    scala.Predef
    中查看
    sum
    product
    和其他内容,只是如果它不在那里,我不会自己定义它。标准库确实有
    sum
    函数。(位于
    GenTraversableOnce
    )@flyingsheep:最优雅的方法是只使用
    exists
    函数,它可能会检查这一点。如果您想自己实现它,则需要使用标准循环机制,并在找到
    true
    .a for循环时中断循环,多么传统:)。我不知道你是否首先提出了
    存在
    所有
    (@rafalotufo的答案经过编辑包括在内)。在这种情况下我该怎么做?两者都不能接受。在TraversableLike中,exists是短路的。我想知道是否还有一个内置的
    。all
    没有参数。@ErikAllik,没有。@ErikAllik如果有一个
    Traversable[Boolean]
    没有参数的.all,那就好了,但我找不到它。