67 votes

Scala : fonctions « toutes » et « toutes »

mon Haskell* est un peu rouillé, donc je peux imaginer qu'il me manque l'évidence :

 def any[A](s: Traversable[A], f: A => Boolean): Boolean = {
    s.foldLeft(false)((bool, elem) => bool || f(elem))
}

L'une de ces propriétés s'applique-t-elle à elle ?

  1. prédéfini quelque part dans les bibliothèques Scala
  2. circonstanciel, et plus rapide écrit comme certains one-liner
  3. faux (je ne l'ai pas testé, désolé ;))

* en fait SML, mais c'est à 99% la même chose, mais connu de personne sous le soleil.

119voto

missingfaktor Points 44003
  1. Il est prédéfini et s'appelle exists . Et forall serait la fonction "tout" que vous recherchez.

     scala> Vector(3, 4, 5).exists(_ % 2 == 0)
    res1: Boolean = true
    
    scala> Vector(3, 4, 5).forall(_ % 2 == 0)
    res2: Boolean = false
    
  2. Vous pouvez le rendre plus performant en utilisant une for avec un break (à partir de scala.util.control.Breaks ). (Voir l'implémentation de la bibliothèque standard de exists et forall .)

  3. C'est correct.

6voto

David Winslow Points 5224

Des méthodes existent sur le trait Traversable qui sont équivalentes à any et 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

1voto

Adam Rabung Points 3014

Que diriez-vous de exists :

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

C'est sur Traversable .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X