verdad tutorial tabla simplificar simplificacion reservadas palabras online miniterminos maxiterminos mapa logicos karnaugh funciones ejercicios ejemplos circuitos booleanas booleana basico scala

scala - tutorial - tabla de verdad funciones booleanas



¿Cómo usar/referirse a la negación de una función booleana en Scala? (3)

Estoy tratando de usar la negación de una función booleana en Scala, como por ejemplo:

def someFunction(x: Set, p: Int => Boolean): Boolean = someOtherFunction(x, !p)

Pero me sale el error:

value unary_! is not a member of Int => Boolean

¿Cómo puedo referirme a la negación de p?


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

x => !p(x)

Si desea poder escribir !p o p && q , puede usar esta biblioteca , que proxenetas funciona y devuelve un bool con varios operadores lógicos.


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

Cuando 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, usando un conjunto de enteros (pruébelo en una hoja de trabajo 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


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

¡También puedes definir! tú 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 solo parece funcionar para funciones de tipo Int => Boolean, y no (Int) => Boolean. La solución no (par) funciona con ambos.