Игнорирование начальных пробелов в квазиквотере "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.

Другие вопросы по тегам