Мне нужна функция, чтобы найти все индексы подстрок в строке. Ниже вы можете найти свой код, но я просто интересно, если есть лучший способ сделать это:Все вхождения подстроки в строке
-- find index of substring in string
-- index_of_substring "so" "unsomesome" -> Just 2
-- index_of_substring "to" "unsomesome" -> Nothing
index_of_substring :: String -> String -> Maybe Int
index_of_substring _ [] = Nothing
index_of_substring sub str = case List.isPrefixOf sub str of
False -> fmap (+1) $ index_of_substring sub (tail str)
True -> Just 0
-- find all occurences of pattern in a string
-- all_occurrences_of_pattern_in_string "so" "unsomesomesome" -> [2,6,10]
all_occurrences_of_pattern_in_string pattern s = helper pattern s [] 0
where helper pattern s result last_idx = case index_of_substring pattern s of
Just n -> helper pattern (drop (n + 1) s) (result ++ [n + last_idx]) (last_idx + n + 1)
Nothing -> result
Вам нужно реализовать его самостоятельно? Существует готовая версия [здесь] (http://hackage.haskell.org/package/KMP-0.1.0.2/docs/Data-Algorithms-KMP.html). –
Мое быстрое решение для разложения списков было неправильным. Да, вы должны просто использовать KMP, [не станет лучше Кнута] (http://xkcd.com/342/) ... – leftaroundabout