Функциональная противоположность flatmap?

Вы знаете, как flatmap берет последовательность элементов и преобразует каждый из них в новую подпоследовательность, объединяя все подпоследовательности:

[A, B, C] -> [A1, A2, B1, B2, B3, C1]

Есть ли название для преобразования, которое делает обратное? Что-то вроде:

[A1, A2, B1, B2, B3, C1] -> [A, B, C]

Конкретным примером, который заставил меня задуматься об этом, была оценка математических выражений:

   1 * 2 + 3 * 4 + 5 + 6 * 7 * 8 
-> 2 + 12 + 5 + 6 + 336 
-> 361

По отдельности оценка 6 * 7 * 8 выглядит как классический шаг reduce, а для того, чтобы решить, какие блоки нужно уменьшить, потребуются повторяющиеся шаги takeWhile.

Я знаю, как сделать это классическим итеративным способом, отслеживая индексы и все такое. Для большинства случаев я нашел хорошую функциональную замену большинству итеративных паттернов. Есть ли название для одной операции, которая это делает, или простой набор операций, которые можно составить для создания такого эффекта?

9
задан Li Haoyi 26 December 2011 в 03:29
поделиться