programming - Scala: funciones "cualquiera" y "todas"
scala programming (4)
mi Haskell * está un poco oxidado, así que puedo imaginar que me falta lo obvio:
def any[A](s: Traversable[A], f: A => Boolean): Boolean = {
s.foldLeft(false)((bool, elem) => bool || f(elem))
}
¿Una de estas propiedades se aplica a esto?
- predefinido en algún lugar de las bibliotecas de Scala
- circunstancial, y escrito más rápido como un trazador de líneas
- mal (no lo probé, lo siento;))
* en realidad SML, pero eso es 99% lo mismo, pero nadie lo conoce bajo el sol.
- No, no está predifinido con esos nombres. Puede usar
existsdesde el paquete Traversable. La mayor desventaja de su implementación es que será necesario consumir todos sus productos transversales, cuando, para
any, si alguno es cierto, si ya podría darle su respuesta. Lo mismo vale paraall. Pero uno podría implementar esto fácilmente para que no evalúe toda la secuencia. Otra solución sería implementar una mónada para este tipo de operación. Entonces llamarías:a and b and cque es equivalente aa.and(b).and(c)Es correcto.
Por cierto, otra función que me parece falta es una función de sum .
Está predefinido y se llama
exists. Y porforallsería la función "todo" que está buscando.scala> Vector(3, 4, 5).exists(_ % 2 == 0) res1: Boolean = true scala> Vector(3, 4, 5).forall(_ % 2 == 0) res2: Boolean = falsePuede hacerlo más
scala.util.control.Breaksutilizando un bucleforcon unbreak(descala.util.control.Breaks). (Consulte la implementación de la biblioteca estándar deexistsyforall).Es correcto.
Existen métodos en el rasgo Traversable que son equivalentes a any y 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