2012-10-01 28 views

Respuesta

51

La negación de p es una función que aplica p a su argumento y anula el resultado.

x => !p(x) 

Si usted quiere ser capaz de escribir o !pp && q puede utilizar this library, que proxenetas funciones que devuelven un bool con varios operadores lógicos.

+1

Parece una buena biblioteca, sin embargo, tengo una restricción que impide el uso de dicha biblioteca: estoy tratando de completar una de las asignaciones de la clase Scala Coursera del Prof. Odersky y estoy sorprendido en este punto porque no puedo simplemente pasar la negación de la función p a otra función. ¿Es imposible hacerlo en Scala? –

+0

Te dije cómo hacerlo en simple scala en la primera parte de la respuesta ... –

+0

Lamento los malentendidos, tienes razón. Acepto tu respuesta tal como es. –

3

Otra forma de resolverlo sin el uso de una función anónima es definir una función concreta para esta tarea.

def even(x:Int):Boolean = x%2==0 
def not(f: Int => Boolean): Int => Boolean = !f(_) 
def odd = not(even) 
odd(1) // true 
odd(2) // false 

¡Usted también puede definir! usted mismo

def even: Int => Boolean = _%2==0 
implicit def bangy(f: Int => Boolean) = new { def unary_! : Int => Boolean = !f(_) } 
def odd = !even 
odd(1) // true 
odd(2) // false 

pero esto sólo parece a las obras para las funciones de tipo int => Boole, y no (Int) => Boole. La solución no (par) funciona con ambos.

13

negación más corta de p: p (_)

Cuando se aplica el predicado p como argumento a otra función:

  • P o P (_) son abreviaturas de la expresión lambda: (x) => p (x)
  • ! p (_) es una abreviatura de la expresión lambda: (x) =>! p (x) y con only! p el compilador se pierde.

Por ejemplo, utilizando un conjunto de números enteros (probarlo en una hoja de Scala):

def someOtherFunction (x: Set[Int], p: Int => Boolean):Boolean = x.forall(p) 
    def someFunction(x: Set[Int], p: Int => Boolean): Boolean = 
    someOtherFunction(x, !p(_)) 

    val x = Set(1,2,3) 
    var p: Int => Boolean = (_ > 0) 
    //_ > 0 is an abbreviaton of (x) => x > 0 

    someFunction(x, p)  //false 
    someOtherFunction(x, p) //true 

    p = _ > 1 
    someFunction(x, p)  //false 
    someOtherFunction(x, p) //false 

    p = _ > 3 
    someFunction(x, p)  //true 
    someOtherFunction(x, p) //false 
    println 
+0

Agregué println porque en mi Scala Eclipse no puedo evaluar una hoja de trabajo si la última oración tiene un comentario en línea. –

Cuestiones relacionadas