Функция токенизатора строки Haskell
Мне нужен был строковый токенизатор в Haskell, но есть видимо ничего уже определенного в прелюдии или других модулях. Есть splitOn в данных.Текст, но это больно использовать, потому что вам нужно обернуть строку в текст.
токенизатор не слишком сложно сделать, поэтому я написал один (он не обрабатывает несколько смежных разделителей, но он хорошо работал для того, что мне нужно). Я чувствую, что что-то вроде этого должно быть уже в модулях где-то..
Это моя версия
tokenizer :: Char -> String -> [String]
tokenizer delim str = tokHelper delim str []
tokHelper :: Char -> String -> [String] -> [String]
tokHelper d s acc
| null pos = reverse (pre:acc)
| otherwise = tokenizer d (tail pos) (pre:acc)
where (pre, pos) = span (/=d) s
Я искал в интернете больше решений и нашел некоторые обсуждения, такие как этот блог.
последний комментарий (от Mahee 10 июня 2011 года) особенно интересен. Почему бы не сделать версию слов более общей для обработки этого? Я попытался найти такую функцию, но не нашел..
есть ли более простой способ этого или "токенизация" строки не очень повторяющиеся проблемы? :)
2 ответов
на сплит библиотека это то, что вам нужно. Установить с помощью cabal install split
, тогда у вас есть доступ к множеству функций стиля split/tokenizer.
некоторые примеры из библиотеки:
> import Data.List.Split
> splitOn "x" "axbxc"
["a","b","c"]
> splitOn "x" "axbxcx"
["a","b","c",""]
> endBy ";" "foo;bar;baz;"
["foo","bar","baz"]
> splitWhen (<0) [1,3,-4,5,7,-9,0,2]
[[1,3],[5,7],[0,2]]
> splitOneOf ";.," "foo,bar;baz.glurk"
["foo","bar","baz","glurk"]
> splitEvery 3 ['a'..'z']
["abc","def","ghi","jkl","mno","pqr","stu","vwx","yz"]
на wordsBy
функция из той же библиотеки является общей версией words
как ты и хотела:
wordsBy (=='x') "dogxxxcatxbirdxx" == ["dog","cat","bird"]
Если вы разбираете язык, подобный Haskell, вы можете использовать lex
функция из прелюдии: http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:lex