Scala布尔函数抽象

时间:2012-03-22 12:19:59

标签: function scala abstraction

我有一个接受布尔函数的函数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

但这不起作用。

3 个答案:

答案 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

优雅,没有。工作,是的。