一行Scala函数到反转(Int=>;布尔)函数 问题:

一行Scala函数到反转(Int=>;布尔)函数 问题:,scala,higher-order-functions,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 %

在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(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)     
            ^     

您必须像下面的示例中那样显式指定输入参数,因为您的函数返回另一个函数:

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

您必须像下面的示例中那样显式指定输入参数,因为您的函数返回另一个函数:

def inv(f: Int => Boolean):(Int => Boolean) = x => !f(x)
你可以写

def inv(f: Int => Boolean):(Int => Boolean) = a => !f(a)     
有什么问题吗!f
f
不是布尔值

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

您可以编写

def inv(f: Int => Boolean):(Int => Boolean) = a => !f(a)     
有什么问题吗!f
f
不是布尔值


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

在Scala中,您可以始终在一行中写入所有内容:只需删除换行符(必要时可以用分号替换)。例如,您的原始示例:
definv(f:Int=>Boolean):(Int=>Boolean)={defg(a:Int):Boolean={!f(a)};g}
。问题是:既然您已经在一行中编写了它,那么您实际上从中获得了什么?在Scala中,您总是可以在一行中编写所有内容:只需删除换行符(如果需要,可以用分号替换它们)。例如,您的原始示例:
definv(f:Int=>Boolean):(Int=>Boolean)={defg(a:Int):Boolean={!f(a)};g}
。问题是:既然你已经把它写在一行了,那么你从中得到了什么呢?非常感谢。了解返回值签名(Int=>Boolean)需要与实现(=…)匹配。非常感谢。理解返回值签名(Int=>Boolean)需要与实现(=…)匹配。