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