部分文字列の抽出

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の初期からある基本的な機能です。takedrop関数はリスト操作関数で、文字列は文字のリストとして扱えるため、これらを直接使えます。代替として takeWhiledropWhile 関数もあり、条件を満たす間要素を取り出すことができます。

Haskellには文字列専用の便利なライブラリもあるため、例えば Data.Text ライブラリだとより強力な文字列処理関数を使えます。これらは Text 型が必要ですが、packunpack 関数で通常の文字列と変換可能です。

パフォーマンス面では、文字列を頻繁に操作する場合は Text 型や ByteString 型を使う方が効率的です。これはHaskellのデフォルト文字列(リスト)が連結リストであるため、大きなデータには不向きだからです。

See Also (参照)

  1. Real World Haskell: http://book.realworldhaskell.org/
  2. Haskell Data.Text documentation: https://hackage.haskell.org/package/text
  3. Learn You a Haskell for Great Good: http://learnyouahaskell.com/
  4. Haskell Data.ByteString documentation: https://hackage.haskell.org/package/bytestring