Scala:“;任何”;和“;全部”;功能
我的Haskell*有点生锈,所以我可以想象我错过了显而易见的: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%是一样的,但在太阳底下没有人知道 不
def any[A](s: Traversable[A], f: A => Boolean): Boolean = {
s.foldLeft(false)((bool, elem) => bool || f(elem))
}
这些属性之一是否适用于it
*实际上是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,那就好了,但我找不到它。