web-dev-qa-db-fra.com

Scala: fonctions «toutes» et «toutes»

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?

  1. prédéfini quelque part dans les bibliothèques Scala
  2. circonstancielle et plus rapide écrite comme une ligne unique
  3. mal (je ne l'ai pas testé, désolé;))

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

61
flying sheep
  1. 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
    
  2. 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.)

  3. C'est correct.

103
missingfaktor

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
6
David Winslow
  1. Non, ce n'est pas prédéfini avec ces noms. Vous pouvez utiliser exists à partir du package Traversable.
  2. 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)

  3. C'est correct.

BTW, une autre fonction que je trouve manquante est une fonction sum.

2
rafalotufo

Que diriez-vous de exists:

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

C'est sur Traversable .

1
Adam Rabung