Я думаю, что вы правы. Не может быть никакого разделения позвоночника в списке, потому что все хвосты разные. Таким образом, список префиксов, если он будет полностью оценен, займет полное пространство & theta;
Обратите внимание, что (более медленная версия) написанной вами функции доступна в Data.List
как inits
.
Однако, вы можете сделать аккуратную оптимизацию. Это уравнение справедливо:
map (foldl f z) . inits = scanl f z
И scanl
работает за линейное время. Поэтому, если вы можете сформулировать то, что вы хотите сделать для каждого префикса, в виде левой складки, тогда вы можете избежать квадратичной сложности построения списка префиксов.