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

时间:2016-08-08 13:19:04

标签: scala higher-order-functions

问题

如果在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)     
            ^     

2 个答案:

答案 0 :(得分:3)

您必须明确指定输入参数,如下例所示,因为您的函数返回另一个函数:

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

答案 1 :(得分:2)

你可以写

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不一致。