Ответ 1
Бумага, на которую указывает Логан, велика, но это немного сложно. (Просто спросите моих учеников.) Это также много говорит о том, "как работает слияние потоков" и только о фракции "что такое слияние потоков и как вы можете его использовать".
Проблема релаксации потока заключается в том, что функциональные коды, как написано, часто выделяют промежуточные списки, например, для создания бесконечного списка чисел node, вы можете написать
nodenames = map ("n"++) $ map show [1..]
Наивный код будет выделять бесконечный список целых чисел [1, 2, 3, ...]
, бесконечный список строк ["1", "2", "3", ...]
и, в конечном счете, бесконечный список имен ["n1", "n2", "n3", ...]
. Это слишком большое выделение.
Что такое потоковое слияние, это преобразование определения типа nodenames
во что-то, что использует рекурсивную функцию, которая выделяет только то, что необходимо для результата. В общем, устранение выделения промежуточных списков называется обезлесением.
Чтобы использовать потоковое слияние, вам необходимо написать нерекурсивные функции списка, которые используют функции из библиотеки потокового синтеза, описанные в GHC ticket 915 (map
, foldr
и т.д.) вместо явной рекурсии. Эта библиотека содержит новые версии всех функций Prelude, которые были переписаны для использования слияния потоков. По-видимому, этот материал планируется сделать в следующем выпуске GHC (6.12), но не находится в текущей стабильной версии (6.10). Если вы хотите использовать библиотеку, то Porges имеет приятное простое объяснение в своем ответе.
Если вы действительно хотите объяснить, как работает слияние потоков, отправьте другой вопрос, но это намного сложнее.