2011-06-17 12 views
50

mi Haskell * es un poco oxidado, así que puedo imaginar que me falta lo obvio:Scala: “ninguna” y “todas las” funciones

def any[A](s: Traversable[A], f: A => Boolean): Boolean = { 
    s.foldLeft(false)((bool, elem) => bool || f(elem)) 
} 

hace una de estas propiedades se aplican a la verdad?

  1. predefinido en algún lugar de las librerías Scala
  2. circunstancial, y más rápido por escrito como algunos de una sola línea
  3. mal (no he probado, lo siento;))

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

+5

Si crees que Haskell es 99% SML, o no has llegado a las mónadas o calificas los principios subyacentes mucho más de la misma manera que el código real y funciona (p. Ej., También considerarías Java 99% C++) – delnan

+0

¿Cómo se relacionan Haskell o SML con esta pregunta? (Tal vez me falta lo obvio) – OscarRyz

+1

Bueno, digamos que el 99% de SML está ** en ** Haskell;) –

Respuesta

80
  1. Es predefinido y se llama exists. Y 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 que sea más performante usando un bucle con un forbreak (de scala.util.control.Breaks). (Consulte la implementación de la biblioteca estándar de exists y forall).

  3. Es correcto.

+0

a para bucle, cómo convencional :). No sé si sacaste 'exists' y' forall' primero (la respuesta de @rafalotufo fue editada para incluirla). ¿cómo debo comportarme en este caso? no puedo aceptar ambos. –

+4

En TraversableLike, existe un cortocircuito. – ziggystar

+0

Me pregunto si también hay un '.all' incorporado sin argumentos. –

2
  1. No, no está predifinida con esos nombres. Puede usar exists del paquete Traversable.
  2. La mayor desventaja de su implementación es que será necesario consumir todos sus elementos 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. De allí tendría que llamar:

    a and b and c lo que equivale a a.and(b).and(c)

  3. Es correcto.

BTW, otra función que me parece falta es una función sum.

+0

Gracias, lo aceptaré tan pronto como Stackoverflow me permita hacerlo. Doble gracias por la sugerencia de salir temprano. ¿Una idea de cómo hacerlo elegantemente? –

+0

Y 'someTraversable.reduceLeft (_ + _)' es un poco más torpe que 'someTraversable.sum', pero no creo que valga la pena definir una función (a diferencia de' any' y 'all', que parecen ser bastante más largo). Tenga en cuenta que a * * * me gustaría ver 'sum',' product' y cosas en 'scala.Predef', también, solo que no lo definiría yo mismo si no estuviera allí. –

+2

La biblioteca estándar tiene la función 'sum'. (Reside en 'GenTraversableOnce'.) – missingfaktor

1

¿Qué tal exists:

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

Está en Traversable.

6

Métodos existe en el rasgo de 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 
Cuestiones relacionadas