Scala: функция высшего порядка для возврата объединения множеств
Я работаю над следующей функцией Scala высшего порядка:
def after(M: Set[Expression], n: String): Set[Set[Expression]] = { M.map((expr: Expression) => aft(expr,n)) }
Функция на корме имеет следующую подпись:
def aft(m: Expression, n: String): Set[Expression]
Тип Expression
абстрактный класс, который я создал.
Я хочу метод after
взять набор М из Expression
s, применить aft
на каждом элементе в M, а затем вернуть объединение результатов (т.е. Set[Expression]
а не Set[Set[Expression]]
). Я думаю, что в этом случае следует использовать функцию более высокого порядка, но я не могу понять, как это сделать, поскольку я все еще считаю себя новичком в Scala и функциональном программировании.
1 ответ
Ты ищешь flatMap
вместо map
:
def after(M: Set[Expression], n: String): Set[Expression] = { M.flatMap((expr: Expression) => aft(expr,n)) }
В целом, для любого определенного пользователем типа, чтобы он вел себя так, как ожидается Set[A]
нужно убедиться hashCode
а также equals
правильно реализованы, иначе равенство между двумя объектами будет использовать Object.equals
, что обычно не то, что вы хотите.
Как примечание, хотя это прекрасный метод, он не является функцией более высокого порядка. Он не принимает функцию в качестве аргумента и не возвращает функцию.