【问题标题】:Writing a variadic Scala predicate method编写可变参数 Scala 谓词方法
【发布时间】:2021-03-04 18:06:03
【问题描述】:

我有以下例子:

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)(_ && _)

但是这不起作用。

我怎样才能做到这一点?

【问题讨论】:

    标签: scala variadic


    【解决方案1】:

    您的问题是您没有通过要测试的值。你可以这样做:

    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 运行。

    【讨论】:

    • 感谢您的回答。非常有帮助!但我想用 foldRight...
    • @gython 你为什么要用foldRight 来做这个? forall 在第一个错误条件下停止,这提高了性能。
    • 你完全正确!不过我想练习一下foldRightfoldLeft的用法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2013-06-11
    • 2018-11-17
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多