Haskell:
部分文字列の抽出
How to: (方法)
Haskellでは部分文字列の抽出には様々な関数が用意されています。以下に例を示します。
import Data.List (isPrefixOf, isSuffixOf, isInfixOf)
main :: IO ()
main = do
let text = "こんにちはHaskell世界"
-- 先頭からの取り出し
let beginning = take 5 text
putStrLn beginning -- 出力: "こんにちは"
-- 末尾からの取り出し
let ending = drop 5 text
putStrLn ending -- 出力: "Haskell世界"
-- 部分文字列が存在するか確認
putStrLn $ if "Haskell" `isInfixOf` text then "含む" else "含まない" -- 出力: "含む"
-- パターンにマッチする部分を取り出し(先頭マッチ)
putStrLn $ if "こんにちは" `isPrefixOf` text then "マッチする" else "マッチしない" -- 出力: "マッチする"
-- パターンにマッチする部分を取り出し(末尾マッチ)
putStrLn $ if "世界" `isSuffixOf` text then "マッチする" else "マッチしない" -- 出力: "マッチする"Deep Dive (深堀り)
部分文字列を取り出す処理はHaskellの初期からある基本的な機能です。take、drop関数はリスト操作関数で、文字列は文字のリストとして扱えるため、これらを直接使えます。代替として takeWhile や dropWhile 関数もあり、条件を満たす間要素を取り出すことができます。
Haskellには文字列専用の便利なライブラリもあるため、例えば Data.Text ライブラリだとより強力な文字列処理関数を使えます。これらは Text 型が必要ですが、pack と unpack 関数で通常の文字列と変換可能です。
パフォーマンス面では、文字列を頻繁に操作する場合は Text 型や ByteString 型を使う方が効率的です。これはHaskellのデフォルト文字列(リスト)が連結リストであるため、大きなデータには不向きだからです。
See Also (参照)
- Real World Haskell: http://book.realworldhaskell.org/
- Haskell
Data.Textdocumentation: https://hackage.haskell.org/package/text - Learn You a Haskell for Great Good: http://learnyouahaskell.com/
- Haskell
Data.ByteStringdocumentation: https://hackage.haskell.org/package/bytestring