mon Haskell * est un peu rouillé, donc je peux imaginer que je 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 à l'IT?
* en fait SML, mais c'est la même chose à 99%, mais personne n'est connu sous le soleil.
Il est prédéfini et s'appelle exists
. Et forall
serait la fonction "all" 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
Vous pouvez le rendre plus performant en utilisant une boucle for
avec un break
(de scala.util.control.Breaks
). (Voir l'implémentation de bibliothèque standard de exists
et forall
.)
C'est correct.
Il existe des méthodes 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
exists
à partir du package Traversable.Le plus gros inconvénient de votre implémentation est que cela va consommer tout votre traversable, quand, pour any
, s'il y en a un, il pourrait déjà vous donner votre réponse. Il en va de même pour all
. Mais on pourrait facilement implémenter cela afin qu'il n'évalue pas la séquence entière. Une autre solution serait d'implémenter une monade pour ce type d'opération. Ensuite, vous appelleriez:
a and b and c
Qui équivaut à a.and(b).and(c)
C'est correct.
BTW, une autre fonction que je trouve manquante est une fonction sum
.
Que diriez-vous de exists
:
scala> List(1,2,3).exists(_ > 2)
res12: Boolean = true
C'est sur Traversable .