Игнорирование начальных пробелов в квазиквотере "lazy-text" в Haskell Text.Shakespeare.Text
Я пишу программу командной строки на Haskell и использую lt
квазиквотер ("ленивый текст") из Text.Shakespeare.Text
, В книге Йесод говорится, что hamlet
квазиквотер игнорирует начальный пробел, если первый непробельный символ является обратной косой чертой (\
).
Это работает в lt
quasiquoter?
Мой код выглядит так:
[lt|Usage: #{programName} [OPTION ...]
\Version #{showVersion version}|]
но выход
Usage: MyProg [OPTION ...]
\Version 0.1.0.0
с Version
строка с слишком большим отступом (и все еще содержит обратную косую черту). Я также попробовал это с пробелом между обратной косой чертой и V
,
Это возможно с текстом Шекспира?
1 ответ
Похоже, что это не сложно, чтобы добавить функцию самостоятельно. lt
это просто QuasiQuoter
, который является типом данных:
QuasiQuoter {
quoteExp :: String -> Q Exp
, quotePat :: String -> Q Pat
, quoteType :: String -> Q Type
, quoteDec :: String -> Q [Dec]
}
Они берут String
и вернуть соответствующий тип haskell шаблона (в зависимости от контекста, в котором он используется.
Преобразовать строку просто, чтобы она работала так, как вы описали с помощью регулярного выражения:
stripWhiteSpaceBeforeBackslash :: String -> String
stripWhiteSpaceBeforeBackslash str = subRegex (mkRegex "^[[:space:]]*\\\\") str ""
Кроме того, функция, которая преобразует QuasiQuoter
с функцией преобразования строки просто:
transformQuasiQuoter :: (String -> String) -> QuasiQuoter -> QuasiQuoter
transformQuasiQuoter transform quasi = QuasiQuoter {
quoteExp = (quoteExp quasi) . transform
, quotePat = (quotePat quasi) . transform
, quoteType = (quoteType quasi) . transform
, quoteDec = (quoteDec quasi) . transform
}
Теперь вы можете сделать версию lt
это делает то, что вам нужно:
lt_ = transformQuasiQuoter stripWhiteSpaceBeforeBackslash lt
Используя это работает как ожидалось:
programName = "SomeProgram"
showVersion _ = "42.42.42"
version = 34
x = [lt_|Usage: #{programName} [OPTIONS...]
\Version #{showVersion version}|]
x
оценивает "Usage: SomeProgram [OPTIONS...]\nVersion 42.42.42"
в ghci.