Эффективная версия '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
или свой)