То есть 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 [email protected](_:ls) = a:(myTails ls)
myTails [] = [[]]
Это почти то же самое, что и стандартная версия, и я подозреваю, что он достигает пространства O(n)
, повторно используя хвосты списков.
Может ли кто-нибудь объяснить:
- Почему моя версия
inits
плохая. - Почему другой подход лучше (либо стандартный в
Data.List
, либо ваш собственный).