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