忽略“中的前导空格”;“懒散文本”;Haskell Text.Shakespeare.Text中的Quasikoter
我正在编写一个Haskell命令行程序,并使用忽略“中的前导空格”;“懒散文本”;Haskell Text.Shakespeare.Text中的Quasikoter,haskell,yesod,shakespeare-text,Haskell,Yesod,Shakespeare Text,我正在编写一个Haskell命令行程序,并使用text.Shakespeare.text中的ltquasikoter(“惰性文本”)。在中,它表示如果第一个非空格字符是反斜杠(\),则hamlet准整数忽略前导空格 这在ltQuasikoter中是否有效 我的代码如下所示: [lt|Usage: #{programName} [OPTION ...] \Version #{showVersion version}|] 但结果是 Usage: MyProg [OPTION ...]
text.Shakespeare.text
中的lt
quasikoter(“惰性文本”)。在中,它表示如果第一个非空格字符是反斜杠(\
),则hamlet
准整数忽略前导空格
这在lt
Quasikoter中是否有效
我的代码如下所示:
[lt|Usage: #{programName} [OPTION ...]
\Version #{showVersion version}|]
但结果是
Usage: MyProg [OPTION ...]
\Version 0.1.0.0
版本
字符串缩进太远(仍然包含反斜杠)。我还尝试了在反斜杠和V
之间留一个空格
这在莎士比亚的文本中是可能的吗?这似乎不太可能,但是你自己添加这个功能并不困难
lt
只是一个quasiqueter
,它是一种数据类型:
QuasiQuoter {
quoteExp :: String -> Q Exp
, quotePat :: String -> Q Pat
, quoteType :: String -> Q Type
, quoteDec :: String -> Q [Dec]
}
它们采用字符串
,并返回适当的模板haskell类型(取决于所使用的上下文)
转换字符串是一件很简单的事情,因此它可以像您使用正则表达式描述的那样工作:
stripWhiteSpaceBeforeBackslash :: String -> String
stripWhiteSpaceBeforeBackslash str = subRegex (mkRegex "^[[:space:]]*\\\\") str ""
此外,使用字符串转换函数转换准整数
的函数也很简单:
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
在ghci中计算为“用法:SomeProgram[OPTIONS…]\nVersion 42.42.42”
。非常好!它在编译时仍然进行计算。