2010-09-16 [長年日記]

[Haskell] 正規表現リテラル

Haskellで正規表現リテラルは、正規表現のリテラルというよりは、ヒアドキュメントっぽいもの + IsStringクラスを使った文字列からRegexへの変換という趣です。正規表現の作成自体もQuasiQuoteでやるならばこんな感じでしょうか。

{-# LANGUAGE TemplateHaskell, ScopedTypeVariables #-}

module RegexQQ where

import Language.Haskell.TH
import Language.Haskell.TH.Quote
import Text.Regex.Posix

qr = QuasiQuoter parseRegex undefined

parseRegex s = sigE (appE (varE 'makeRegex) (stringE s)) (conT ''Regex)

これで、

[$qr|...|]

を、

makeRegex "..." :: Regex

に変換します。後ろの型シグニチャは本来はいらないのですが、ないと使う側で型を指定しないといけなくて面倒なので付けてあります。型シグニチャなしなら、

parseRegex s = appE (varE 'makeRegex) (stringE s)

だけでOKです。もうちょっと凝るなら、[$qr|/ab*c/i|]のようにオプションを指定できるようにすると良いかも。

ところで、QuasiQuoteの終了(|])はバックスラッシュでエスケープできるようですが、本当にバックスラッシュを最後に置きたかったらどうすれば良いのでしょう。[$qr|\|]でも、[$qr|\\|]でもエラーなんですが…

[]

トップ «前の日記(2010-09-15) 最新