10

我需要 Haskell 中的字符串标记器,但Prelude 或其他模块中显然没有定义任何内容。Data.Text 中有 splitOn,但使用起来很痛苦,因为您需要将 String 包装到 Text。

标记器不太难做到,所以我写了一个(它不处理多个相邻的分隔符,但它对我需要的东西很有效)。我觉得这样的东西应该已经在某个地方的模块中了..

这是我的版本

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 于 2011 年 6 月 10 日发表)特别有趣。为什么不制作一个更通用的单词版本来处理这个问题呢?我尝试搜索这样的功能,但没有找到..

有没有更简单的方法,或者“标记”字符串不是一个经常出现的问题?:)

4

2 回答 2

16

拆分库是您所需要的。使用 安装cabal install split,然后您可以访问许多拆分/标记器样式的功能。

图书馆的一些例子:

 > 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"]
于 2011-11-25T04:29:10.170 回答
5

如果您正在解析类似 Haskell 的语言,您可以使用lexPrelude 中的函数:http ://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:lex

于 2011-11-26T05:22:30.017 回答