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
exists
desde 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 c
que 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 porforall
serí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 = false
Puede hacerlo más
scala.util.control.Breaks
utilizando un buclefor
con unbreak
(descala.util.control.Breaks
). (Consulte la implementación de la biblioteca estándar deexists
yforall
).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