10

Haskellに文字列トークナイザーが必要でしたが、プレリュードや他のモジュールにはまだ何も定義されていないようです。Data.TextにはsplitOnがありますが、文字列をテキストにラップする必要があるため、これを使用するのは面倒です。

トークナイザーはそれほど難しくないので、1つ作成しました(複数の隣接する区切り文字を処理しませんが、必要なものにはうまく機能しました)。このようなものはすでにどこかのモジュールにあるはずだと思います。

これは私のバージョンです

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

私はインターネットで他の解決策を検索し、このブログ投稿のようないくつかの議論を見つけました。

最後のコメント(2011年6月10日のMaheeによる)は特に興味深いものです。これを処理するために、単語のバージョンをより一般的に機能させてみませんか?そのような関数を検索してみましたが、見つかりませんでした。

これを行うためのより簡単な方法はありますか、それとも文字列の「トークン化」はそれほど頻繁に発生する問題ではありませんか?:)

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のような言語を解析している場合はlex、プレリュードの関数を使用できます:http: //hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v :lex

于 2011-11-26T05:22:30.017 に答える