簡體   English   中英

如何在scala過濾器中實現“或”?

[英]How to implement “or” in a scala filter?

我正在嘗試在scala中實現“或”過濾列表。

    list.filter(_ % 3 ==0 || _ % 5 ==0)

但我收到這個錯誤:

錯誤:參數數量錯誤; 預期= 1

那么如何將其分組為一個參數。

不要試圖比你更簡潔:

list.filter(x => x % 3 ==0 || x % 5 ==0)

下划線不起作用,因為第n個_被擴展為第n個參數,如下所示:

list.filter((x,y) => x % 3 ==0 || y % 5 ==0)

如果參數僅在函數表達式中出現一次,則只能使用占位符語法。 否則,您必須顯式聲明函數參數:

list.filter(x => x % 3 == 0 || x % 5 == 0)

多個占位符擴展為多個方法參數。

最簡單的解決方案是使用:

list.filter(x => (x % 3 == 0) || (x % 5 == 0))

如果你想獲得幻想並實現一個“或”,看看我是如何用一些拉皮條做的: Predicates 提供皮條客的簡單解決方案是:

trait Pred1[A] extends (A => Boolean){
  self =>

  def or[AA >: A](that: AA => Boolean) = new Pred1[A]{
    def apply(arg: A) = self(arg) || that(arg)
  }
}

//and somewhere in the code
implicit def f2p[A](f: A => Boolean) = new Pred1[A]{ def apply(arg: A) = f(arg) }

等等“和”,“xor”,“nxor”,“nor”和“nand”。 那么你所做的只是提出你傳遞給過濾器的兩個函數。

請注意,我可能正在用類型類替換拉皮條,並在另一個分支中玩弄一些想法,但幾乎沒有空閑時間真正深入研究它。

功能替代:

val or = (xs: List[Int => Boolean]) => (x: Int) => xs.exists(_(x))

List(0, 1, 2, 3, 4, 5, 6).filter(or(List(_ % 3 == 0, _ % 5 == 0)))

甚至更簡單:

val or = { def or(xs: (Int => Boolean)*) = (x: Int) => xs.exists(_(x)); or _}
List(0, 1, 2, 3, 4, 5, 6).filter(or(_ % 3 == 0, _ % 5 == 0))

更新 :第二個版本似乎不適用於Scala 2.10,所以最好使用方法:

def or[T](xs: (T => Boolean)*) = (x: T) => xs.exists(_(x))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM