【问题标题】:Scala: Higher order function to return the union of setsScala:返回集合并集的高阶函数
【发布时间】:2017-05-03 04:28:59
【问题描述】:

我正在研究以下 scala 高阶函数:

def after(M: Set[Expression], n: String): Set[Set[Expression]] = { M.map((expr: Expression) => aft(expr,n)) }

函数 aft 具有以下签名:

def aft(m: Expression, n: String): Set[Expression]

Expression 类型是我创建的一个抽象类。

我希望 after 方法获取一组 M 的 Expressions,将 aft 应用于 M 中的每个元素,然后返回结果的并集(即 Set[Expression] 而不是 @987654328 @)。我认为在这种情况下应该使用更高阶的函数,但我真的不明白该怎么做,因为我仍然认为自己是 Scala 和函数式编程的新手。

【问题讨论】:

    标签: scala functional-programming user-defined-functions higher-order-functions


    【解决方案1】:

    您正在寻找flatMap 而不是map

    def after(M: Set[Expression], n: String): Set[Expression] = { M.flatMap((expr: Expression) => aft(expr,n)) }
    

    一般来说,对于任何用户定义的类型,如果要与Set[A] 一样,需要确保正确实现hashCodeequals,否则两个对象之间的相等性将使用Object.equals,这通常不是你想要什么。

    附带说明,虽然这是一个可爱的方法,但它不是一个高阶函数。它不接受函数作为参数,也不返回函数。

    【讨论】:

    • 我试过了,但是因为我正在使用我自己的 Expression 类,所以它不起作用。有没有办法实现我自己的平面地图?
    • @wirdis 您不需要自己的flatMap,您需要在Expression 上实现hashCodeequals,或者它为Set 继承子代以正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多