一行 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
不是一个类型)。
问题
在 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
不是一个类型)。