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 взять набор М из Expressions, применить 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, что обычно не то, что вы хотите.

Как примечание, хотя это прекрасный метод, он не является функцией более высокого порядка. Он не принимает функцию в качестве аргумента и не возвращает функцию.

Другие вопросы по тегам