如何在Scala中使用/引用布尔函数的否定?

我想在Scala中使用布尔函数的否定,比如:

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

但是我得到的错误:

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

我怎样才能提到p的否定?

p的否定是将p应用于其论证并且否定结果的函数。

 x => !p(x) 

如果你想能写!pp && q你可以使用这个库 ,这个pimps函数返回一个bool和各种逻辑运算符。

p的最短否定: !p(_)

当你将谓词p作为参数应用于另一个函数时:

  • p或p(_)是lambdaexpression式的缩写:(x)=> p(x)
  • !p(_)是lambdaexpression式的缩写:(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 

另一种不使用匿名函数的方法就是为这个任务定义一个具体的函数。

 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 => Booleantypes的函数,而不是(Int)=> Boolean。 不(偶)解决scheme适用于两者。