Scala логическая функция абстракция - PullRequest
0 голосов
/ 22 марта 2012

У меня есть функция foo, которая принимает логическую функцию

def foo( f:(_)=>Boolean ) = //do something with f

Я могу вызвать foo следующим образом

foo( (x:Int) => x == 0 )

Теперь я хочу изменить foo, чтобы она принимала любую функцию, которая возвращает логическое значение,например.модифицированный 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 ]

4 голосов
/ 22 марта 2012

Соответствует ли он вашим потребностям 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 голос
/ 22 марта 2012

Если вам нужно обработать более 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

Элегантно, нет. Работает, да.

1 голос
/ 22 марта 2012

Что сказал @ Николас.

Вы можете сделать код сайта вызова немного приятнее, используя 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...