Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
忽略“中的前导空格”;“懒散文本”;Haskell Text.Shakespeare.Text中的Quasikoter_Haskell_Yesod_Shakespeare Text - Fatal编程技术网

忽略“中的前导空格”;“懒散文本”;Haskell Text.Shakespeare.Text中的Quasikoter

忽略“中的前导空格”;“懒散文本”;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 ...]

我正在编写一个Haskell命令行程序,并使用
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”

非常好!它在编译时仍然进行计算。