Versión eficiente de 'inits'

Es decir,inits "abc" == ["","a","ab","abc"]

Hay una versión estándar deinits enData.List, pero a continuación he escrito una versión yo mismo:

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

Si bien mi versión es bastante más simple que la versión estándar, sospecho que no es tan buena por razones de eficiencia. Sospecho que cuandomyInits l se evalúa completamente se necesitaO(n^2) espacio. Tomar como ejemplo,myTails, una implementación details:

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

Que es casi exactamente lo mismo que la versión estándar y sospecho que lograO(n) espacio reutilizando las colas de las listas.

Podría alguien explicar:

¿Por qué mi versión deinits es malo.Por qué otro enfoque es mejor (ya sea el estándar enData.List o el tuyo).

Respuestas a la pregunta(2)

Su respuesta a la pregunta