Функция токенизатора строки 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