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.Text
documentation: https://hackage.haskell.org/package/text - Learn You a Haskell for Great Good: http://learnyouahaskell.com/
- Haskell
Data.ByteString
documentation: https://hackage.haskell.org/package/bytestring