我有一个接受布尔函数的函数foo
def foo( f:(_)=>Boolean ) = //do something with f
我可以按如下方式调用foo
foo( (x:Int) => x == 0 )
现在,我希望修改foo接受任何返回Boolean的函数。例如。修改后的foo应该适用于以下情况。
foo( (x:Int, y:Int) => x == y)
foo( (x:Int, y:Int, z:Int) => x == y && y == z)
foo( (x:Double, y:Double, z:Double, p:Double) => x < y && y < z && z < p)
//and so on...
我的第一次尝试是修改foo,如下所示
def foo2( f:(_*)=>Boolean ) = //do something with f
但这不起作用。
答案 0 :(得分:4)
是否符合您的需求def foo[A](pred: A => Boolean)
例如:
def foo[A](pred: A => Boolean): A => Boolean = {x:A =>
if (pred(x)) {
println("Yeah!")
true
} else {
false
}
}
然后:
foo {xy:(Int, Int) => xy._1 == xy._2}
foo {xyz:(Int, Int, Int) => xyz._1 == xyz._2 && xyz._2 == xyz._3}
答案 1 :(得分:1)
@Nicolas说的话。
您可以使用Function.tupled
使呼叫网站代码更加精确。
scala> def foo[A](f: A => Boolean) = 0
foo: [A](f: A => Boolean)Int
scala> import Function.tupled
import Function.tupled
scala> foo(tupled((x: Int, y: Int) => x == y))
res0: Int = 0
scala> foo(tupled((x: Int, y: Int, z: Int) => x < y && y < z))
res1: Int = 0
答案 2 :(得分:1)
如果你需要处理5个以上的参数,你可以重载foo
,无论你需要多少个参数。 Scala(当前)只能处理最多Function22
的函数,因此您可以使用22行代码和良好的调用站点使用来覆盖所有可能性。
def foo[T](f: (T) => Boolean) = true
def foo[T](f: (T, T) => Boolean) = true
def foo[T](f: (T, T, T) => Boolean) = true
def foo[T](f: (T, T, T, T) => Boolean) = true
def foo[T](f: (T, T, T, T, T) => Boolean) = true
// snip
def foo[T](f: (T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T) => Boolean) = true
优雅,没有。工作,是的。