Вот комментарий от ответа Стива Мозли (by ToolmakerSteve), который ставит вещи в точку зрения (в целом onSaveInstanceState vs onPause, восточная стоимость и сага о западе)
@VVK - я частично не согласны. Некоторые способы выхода из приложения не запускают onSaveInstanceState (oSIS). Это ограничивает полезность ОСШ. Его стоит поддерживать для минимальных ресурсов ОС, но если приложение хочет вернуть пользователя в состояние, в котором они находились, вне зависимости от того, как приложение было выведено, вместо этого необходимо использовать подход с постоянным хранилищем. Я использую onCreate для проверки пакета, и если он отсутствует, проверьте целостность хранилища. Это централизует принятие решений. Я могу восстановиться после сбоя, или выйти из задней кнопки или пользовательского пункта меню «Выход», или вернуться к пользователю экрана через несколько дней. - ToolmakerSteve Сен 19 '15 в 10:38
blockquote>
Обратите внимание, что подпись типа вашей попытки неверна. Вы хотите, чтобы все комбинации разбиений подслов были списком строк, а ваш тип - просто списком строк.
Это будет работать:
onHead :: (a -> a) -> [a] -> [a]
onHead _ [] = []
onHead f (x:xs) = f x:xs
combos :: [a] -> [[[a]]]
combos [] = [[]]
combos [x] = [[[x]]]
combos (x:xs) = [([x]:), onHead (x:)] <*> combos xs
onHead
должно быть самоочевидным: выполнить данную функцию в начале списка. combos
повторяется следующим образом: подсловами строки являются подсловы ее хвоста, с двумя вариантами для каждого: либо заголовок является своим собственным подсловом, либо он прикреплен к началу первого подслово.
Обновление: вот еще один подход (чище IMO):
combos :: Foldable t => t a -> [[[a]]]
combos = foldr (concatMap . go) [[]]
where go x [] = [[[x]]]
go x l@(h:t) = [[x]:l, (x:h):t]
Он использует ту же технику, что и выше, только с более чистой реализацией.