你不能表达一个函数的逆,但你可以表达它的结果的逆,也许这会适合你。
当您传递函数时,这可能很有用。
例如,如果您有一个函数f: Int => Boolean
用作高阶函数的参数,则可以将其包装在另一个相同类型的函数中,该函数x => !f(x)
只返回计算结果的倒数:
def select(ls: List[String], p: String => Boolean): List[String] =
ls.remove(x => !p(x))
// select: (ls: List[String], p: String => Boolean)List[String]
val li = List("one", "two", "three")
// li: List[java.lang.String] = List(one, two, three)
/* using select with some conditions */
select(li, _.length() > 3) // equivalent to select(li, x => x.length() > 3)
// res0: List[String] = List(three)
select(li, _.length() <= 3) // equivalent to select(li, x => x.length() <= 3)
// res1: List[String] = List(one, two)
/* using remove with the same conditions */
li.remove(_.length() > 3) // equivalent to li.remove(x => x.length() > 3)
// res2: List[java.lang.String] = List(one, two)
li.remove(_.length() <= 3) // equivalent to li.remove(x => x.length() <= 3)
// res3: List[java.lang.String] = List(three)
注意:remove
类中的方法List
已弃用,filterNot
应改为使用,但我认为在此示例remove
中读起来更好。