一行 Scala 函数反转 (Int => Boolean) 函数

One line Scala function to invert (Int => Boolean) function

问题

在 Scala 中是否有一种方法可以在一行中定义下面的 inv 函数?

// Function to invert a decision function such as even/odd/positive/...
def inv(f: Int => Boolean):(Int => Boolean) = {
    def g(a:Int):Boolean = {
        !f(a)
    }
    g
}

// Test
def even(x:Int):Boolean = (x % 2 == 0)
val odd = inv(even)
println("odd(99) is %s".format(odd(99)))
----
odd(99) is true 

问题

在下面尝试使用 !f 或 !f(a),但出现错误。不确定到底出了什么问题。如能给出解释,将不胜感激

def inv(f: Int => Boolean):(Int => Boolean) = !f
----
error: value unary_! is not a member of Int => Boolean

def inv(f: a:Int => b:Boolean):(Int => Boolean) = !f(a)
----
error: ')' expected but ':' found.                                                                                                                                               
def inv(f: a:Int => b:Boolean):(Int => Boolean) = !f(a)     
            ^     

您必须像下面的示例一样明确指定输入参数,因为您的函数 returns 另一个函数:

def inv(f: Int => Boolean):(Int => Boolean) = x => !f(x)

你可以写

def inv(f: Int => Boolean):(Int => Boolean) = a => !f(a)     

!f 有什么问题:f 不是 Boolean

def inv(f: a:Int => b:Boolean) 有什么问题:当解析器查看此定义时,它知道 f: 后面将跟一个类型。 a可以是一个类型,但是在这种情况下它后面不能跟:a:Int => b:Boolean不是一个类型)。