Мы могли бы объединить два обхода списка xs
в выражении
(map f xs, map g xs)
вот так
unzip (map (\x -> (f x, g x)) xs)
Есть ли какие-либо исследования по автоматическому выполнению такого слияния?
(Здесь есть риск создать утечку пространства, если один из возвращенных списков будет использован раньше другого. Меня больше интересует предотвращение дополнительного обхода xs
, чем экономия места.)
Редактировать: на самом деле я не собираюсь применять слияние к реальным спискам Haskell в памяти, где это преобразование может не иметь смысла в зависимости от того, можно ли unzip
объединить с его потребителем (ями). У меня есть настройка, в которой я знаю, что unzip
может плавиться (см. «FlumeJava: простые и эффективные конвейеры параллельных данных»).