Adi*_*Adi 9 haskell functional-programming ghc haskell-platform
我在Haskell中需要一个String tokenizer,但在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
Run Code Online (Sandbox Code Playgroud)
我在互联网上搜索了更多解决方案并找到了一些讨论,比如这篇博文.
最后一条评论(由Mahee于2011年6月10日发布)特别有趣.为什么不使一个版本的单词功能更通用来处理这个?我试着搜索这样的功能但没找到..
有没有更简单的方法,或者'标记'字符串不是一个非常反复出现的问题?:)
Dav*_*ani 16
该拆分图书馆是你所需要的.安装with 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"]
Run Code Online (Sandbox Code Playgroud)
在wordsBy来自相同的库函数是一个通用版本words像你想要的东西:
wordsBy (=='x') "dogxxxcatxbirdxx" == ["dog","cat","bird"]
Run Code Online (Sandbox Code Playgroud)