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|\\|]でもエラーなんですが…