Подтвердить что ты не робот

Как использовать/ссылаться на отрицание булевой функции в Scala?

Я пытаюсь использовать отрицание булевой функции в Scala, например:

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

Но я получаю ошибку:

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

Как я могу ссылаться на отрицание p?

4b9b3361

Ответ 1

Отрицание p - это функция, которая применяет p к своему аргументу и отрицает результат.

x => !p(x)

Если вы хотите писать !p или p && q, вы можете использовать эту библиотеку, какие сутенеры функции, которые возвращают bool с различными логическими операторами.

Ответ 2

Кратчайшее отрицание p: ! p (_)

При применении предиката p в качестве аргумента к другой функции:

  • p или p (_) - аббревиатуры выражения лямбда: (x) = > p (x)
  • ! p (_) является аббревиатурой выражения lambda: (x) = > ! p (x) и только с! p компилятор теряется.

Например, используя набор целых чисел (попробуйте его на рабочем листе 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

Ответ 3

Другим способом решения этой проблемы без использования функции анонима является определение конкретной функции для этой задачи.

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

Вы также можете определить! себя

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

но это, похоже, работает только для функций типа Int = > Boolean, а не (Int) = > Boolean. Решение (четное) работает с обоими.