编写可变 Scala 谓词方法
Writing a variadic Scala predicate method
我有以下示例:
val check30 = allTrue(x:Int => x%2 == 0, x:Int => x%3 == 0, x:Int => x%5== 0)
val check30(60) //evaluates to true
我想编写一个谓词方法 allTrue
,它采用几个谓词,就像在示例中一样,并通过 foldRight
.
组合它们
我试过这样的事情:
def allTrue[T](pred: T =>Boolean*): Boolean =
pred.foldRight(true)(_ && _)
但是这不起作用。
我该怎么做才对?
你的问题是你没有传递你想要测试的值。你可以这样做:
def allTrue[T](pred: T => Boolean*)(value: T): Boolean =
pred.forall(p => p(value))
然后使用它:
val check30 = allTrue[Int](_ % 2 == 0, _ % 3 == 0, _ % 5 == 0)(_)
val result = check30(60) //evaluates to true
println(result)
使用foldRight
你可以做到:
def allTrue[T](pred: T => Boolean*)(value: T): Boolean =
pred.foldRight(true)((p, b) => b && p(value))
代码 运行 在 Scastie。
我有以下示例:
val check30 = allTrue(x:Int => x%2 == 0, x:Int => x%3 == 0, x:Int => x%5== 0)
val check30(60) //evaluates to true
我想编写一个谓词方法 allTrue
,它采用几个谓词,就像在示例中一样,并通过 foldRight
.
我试过这样的事情:
def allTrue[T](pred: T =>Boolean*): Boolean =
pred.foldRight(true)(_ && _)
但是这不起作用。
我该怎么做才对?
你的问题是你没有传递你想要测试的值。你可以这样做:
def allTrue[T](pred: T => Boolean*)(value: T): Boolean =
pred.forall(p => p(value))
然后使用它:
val check30 = allTrue[Int](_ % 2 == 0, _ % 3 == 0, _ % 5 == 0)(_)
val result = check30(60) //evaluates to true
println(result)
使用foldRight
你可以做到:
def allTrue[T](pred: T => Boolean*)(value: T): Boolean =
pred.foldRight(true)((p, b) => b && p(value))
代码 运行 在 Scastie。