Разделение слова на все возможные & ldquo; Подслово & rdquo; - Все возможные комбинации без импорта [дубликаты]

Вот комментарий от ответа Стива Мозли (by ToolmakerSteve), который ставит вещи в точку зрения (в целом onSaveInstanceState vs onPause, восточная стоимость и сага о западе)

@VVK - я частично не согласны. Некоторые способы выхода из приложения не запускают onSaveInstanceState (oSIS). Это ограничивает полезность ОСШ. Его стоит поддерживать для минимальных ресурсов ОС, но если приложение хочет вернуть пользователя в состояние, в котором они находились, вне зависимости от того, как приложение было выведено, вместо этого необходимо использовать подход с постоянным хранилищем. Я использую onCreate для проверки пакета, и если он отсутствует, проверьте целостность хранилища. Это централизует принятие решений. Я могу восстановиться после сбоя, или выйти из задней кнопки или пользовательского пункта меню «Выход», или вернуться к пользователю экрана через несколько дней. - ToolmakerSteve Сен 19 '15 в 10:38

2
задан RottenCrusader 24 March 2019 в 15:29
поделиться

1 ответ

Обратите внимание, что подпись типа вашей попытки неверна. Вы хотите, чтобы все комбинации разбиений подслов были списком строк, а ваш тип - просто списком строк.

Это будет работать:

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]

Он использует ту же технику, что и выше, только с более чистой реализацией.

0
ответ дан Joseph Sible 24 March 2019 в 15:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: