Versão eficiente de 'inits'

Isso é,inits "abc" == ["","a","ab","abc"]

Existe uma versão padrão doinits noData.List, mas abaixo eu mesmo escrevi uma versão:

myInits = f id
 where
  f start (l:ls) = (start []):(f (start . (l:)) ls)
  f start [] = [(start [])]

Embora minha versão seja um pouco mais simples que a versão padrão, suspeito que não seja tão boa por motivos de eficiência. Eu suspeito que quandomyInits l é totalmente avaliado é precisoO(n^2) espaço. Considere por exemplo,myTails, uma implementação details:

myTails a@(_:ls) = a:(myTails ls)
myTails [] = [[]]

Que é quase exatamente igual à versão padrão e eu suspeito que alcançaO(n) espaço reutilizando as caudas das listas.

Alguém poderia explicar:

Por que minha versão doinits é ruim.Por que outra abordagem é melhor (a padrão emData.List ou o seu próprio).

questionAnswers(2)

yourAnswerToTheQuestion