如果在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)
^
答案 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
不一致。