tutorial programming learn koans functional exercises codecademy app scala functional-programming

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?

  1. predefinido en algún lugar de las bibliotecas de Scala
  2. circunstancial, y escrito más rápido como un trazador de líneas
  3. mal (no lo probé, lo siento;))

* en realidad SML, pero eso es 99% lo mismo, pero nadie lo conoce bajo el sol.


  1. No, no está predifinido con esos nombres. Puede usar exists desde el paquete Traversable.
  2. 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 para all . 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 a a.and(b).and(c)

  3. Es correcto.

Por cierto, otra función que me parece falta es una función de sum .


  1. Está predefinido y se llama exists . Y por forall 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

  2. Puede hacerlo más scala.util.control.Breaks utilizando un bucle for con un break (de scala.util.control.Breaks ). (Consulte la implementación de la biblioteca estándar de exists y forall ).

  3. Es correcto.


¿Qué tal exists ?

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

Está en Traversable .


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