如何在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)
如果你想能写!p
或p && 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适用于两者。