Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何在x:Myclass=>;列表中使用左折;布尔运算来获得连词?_Scala_Fold - Fatal编程技术网

Scala 如何在x:Myclass=>;列表中使用左折;布尔运算来获得连词?

Scala 如何在x:Myclass=>;列表中使用左折;布尔运算来获得连词?,scala,fold,Scala,Fold,我有一些过滤器表示为函数列表列表(MyClass=>Boolean)。我试图得到所有成员的逻辑连接(和)。我有一种感觉,我可以在这里使用折叠。但是我不了解语法,尤其是关于如何将MyClass参数传递给函数的语法。这很简单。假设您的列表(MyClass=>Boolean)函数名为谓词,并且您正在测试的MyClass名为MyClass`: val result: Boolean = predicates.foldLeft(true) { (value, predicate) =>

我有一些过滤器表示为函数列表列表(MyClass=>Boolean)。我试图得到所有成员的逻辑连接(和)。我有一种感觉,我可以在这里使用折叠。但是我不了解语法,尤其是关于如何将MyClass参数传递给函数的语法。

这很简单。假设您的
列表(MyClass=>Boolean)
函数名为
谓词,并且您正在测试的
MyClass
名为
MyClass`:

val result: Boolean = predicates.foldLeft(true) {
  (value, predicate) => 
    value && predicate(myClass)
}
或在包装函数中:

def conjunction(myClass: MyClass, predicates: List[MyClass => Boolean]) = 
  predicates.foldLeft(true) {
    (value, predicate) => 
      value && predicate(myClass)
  }
说明:如果谓词列表由三个函数组成:
foo(myClass:myClass):Boolean
bar(myClass:myClass):Boolean
buzz(myClass:myClass):Boolean
上述代码大致相当于:

((true && foo(myClass)) && bar(myClass) && buzz(myClass)

不久前,我写了一篇关于谓词的文章。

谓词。foldLeft(true)(&&&&uu(myClass))
也可能有用。

您可以在这里使用
foldLeft
,但是
对于所有的
来说都更好:

def check[A](filters: Seq[A => Boolean])(a: A) = filters.forall(_(a))
其工作原理如下:

scala> val filters = Seq[Int => Boolean]((_ > 0), (_ % 2 == 1), (_ < 1000))
filters: Seq[Int => Boolean] = List(<function1>, <function1>, <function1>)

scala> check(filters)(10)
res0: Boolean = false

scala> check(filters)(103)
res1: Boolean = true

最后一个过滤器(有副作用),因为第二个失败。

< P>,让我们考虑两个这样的谓词:

val pa: T => Boolean = ???
val pb: T => Boolean = ???
它们的连接方式如下:

val pab: T => Boolean = (v: T) => pa(V) && pb(v)
从这里可以得到折叠的公式:

list.tail.foldLeft(list.head) {
  case (pa, pb) => v => pa(v) && pb(v)
}

在这些情况下,我所做的是使用“Pimp My Library”模式在谓词上添加布尔运算,这只是对结果的布尔运算,提升到谓词上明显的布尔组合。因此我可以这样说

import MyRichPredicate;

val f:Int=>Boolean = (x:Int)=>x%3==0
val g:Int=>Boolean = (x:Int)=>x%5==0
val h = f && !g  //equivalent to (x:Int)=> x%3 == 0 && x%5!=0
print(h(9)) // prints true
print(h(15)) // prints false
考虑到这种管道,你想要的折叠可以写为

predicates.foldLeft(x=>true)(_&&_)
甚至更性感

predicates.reduce(_&&_)
predicates.reduce(_&&_)