Я думал о списках в Haskell, и я думал, что в других языках списки не используются для всего. Конечно, вы можете захотеть сохранить список, если вам потребуются значения позже, но если это всего лишь один случай, скажем, итерация от [1..n]
, зачем использовать список, где все, что действительно нужно, — это увеличиваемая переменная?
Я также читал о «слиянии списков» и заметил, что, хотя компиляторы Haskell пытаются реализовать эту оптимизацию для устранения промежуточных списков, они часто безуспешны, в результате чего сборщику мусора приходится очищать списки, которые используются только один раз.
Кроме того, если вы не будете осторожны, вы можете легко поделиться списком, что означает, что сборщик мусора не очистит его, что может привести к нехватке памяти с помощью алгоритма, который ранее был разработан для работы в постоянном пространстве.
Поэтому я подумал, что было бы лучше полностью избегать списков, по крайней мере, когда кто-то на самом деле не хочет «хранить» список.
Затем я наткнулся на conduit
, в котором говорится, что это:
решение проблемы потоковой передачи данных, позволяющее производить, преобразовывать и потреблять потоки данных в постоянной памяти.
Это звучало идеально. Я знаю, что conduit
предназначен для IO
проблем с получением и выпуском ресурсов, но можно ли просто использовать его как замену спискам?
Например, могу ли я сделать следующее:
fold f3 $ take 10 $ map f2 $ unfold f1 init_value
И с несколькими правильно размещенными аннотациями типов использовать каналы для всего процесса вместо списков?
Я надеялся, что, возможно, classy-prelude
позволит использовать такой код, но я не уверен. Если возможно, может ли кто-нибудь привести пример, например, как указано выше?
conduit
, связана с ленивым вводом-выводом. также посмотрите на пакетvector
. - person jberryman   schedule 15.01.2013