Эффективная версия 'inits'

То есть,inits "abc" == ["","a","ab","abc"]

Существует стандартная версияinits вData.List, но ниже я сам написал версию:

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

Хотя моя версия немного проще, чем стандартная, я подозреваю, что она не так хороша по соображениям эффективности. Я подозреваю, что когдаmyInits l полностью оценен, это занимаетO(n^2) пространство. Взять, к примеру,myTails, реализацияtails:

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

Что почти точно так же, как стандартная версия, и я подозреваю, что достигаетO(n) пространство путем повторного использования хвостов списков.

Может ли кто-нибудь объяснить:

Почему моя версияinits плохо.Почему другой подход лучше (либо стандартный вData.List или свой)

Ответы на вопрос(2)

Ваш ответ на вопрос