Scala:return 集并集的高阶函数
Scala: Higher order function to return the union of sets
我正在研究以下 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
是我创建的抽象class。
我希望方法 after
获取 Expression
的集合 M,对 M 中的每个元素应用 aft
,然后 return 的并集结果(即 Set[Expression]
而不是 Set[Set[Expression]]
)。我认为在这种情况下应该使用高阶函数,但我真的不明白该怎么做,因为我仍然认为自己是 Scala 和函数式编程的新手。
您正在寻找 flatMap
而不是 map
:
def after(M: Set[Expression], n: String): Set[Expression] = { M.flatMap((expr: Expression) => aft(expr,n)) }
一般而言,要让任何用户定义的类型都按 Set[A]
的预期行为,需要确保正确实现 hashCode
和 equals
,否则两个对象之间的相等性将使用Object.equals
,这通常不是你想要的。
附带说明一下,虽然这是一个可爱的方法,但它不是高阶函数。它不接受函数作为参数,也不是 return 函数。
我正在研究以下 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
是我创建的抽象class。
我希望方法 after
获取 Expression
的集合 M,对 M 中的每个元素应用 aft
,然后 return 的并集结果(即 Set[Expression]
而不是 Set[Set[Expression]]
)。我认为在这种情况下应该使用高阶函数,但我真的不明白该怎么做,因为我仍然认为自己是 Scala 和函数式编程的新手。
您正在寻找 flatMap
而不是 map
:
def after(M: Set[Expression], n: String): Set[Expression] = { M.flatMap((expr: Expression) => aft(expr,n)) }
一般而言,要让任何用户定义的类型都按 Set[A]
的预期行为,需要确保正确实现 hashCode
和 equals
,否则两个对象之间的相等性将使用Object.equals
,这通常不是你想要的。
附带说明一下,虽然这是一个可爱的方法,但它不是高阶函数。它不接受函数作为参数,也不是 return 函数。