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).