首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Haskell Text.Shakespeare.Text中忽略“惰性文本”准商标符中的前导空格

在Haskell Text.Shakespeare.Text中忽略“惰性文本”准商标符中的前导空格
EN

Stack Overflow用户
提问于 2013-08-31 21:50:04
回答 1查看 140关注 0票数 1

我正在编写一个Haskell命令行程序,并使用来自Text.Shakespeare.TextText.Shakespeare.Text拟商器(“惰性文本”)。在叶索德书中,它说如果第一个非空白字符是反斜杠(\),则hamlet拟商忽略前导空格。

这在lt准商中有效吗?

我的代码如下所示:

代码语言:javascript
复制
[lt|Usage: #{programName} [OPTION ...]
   \Version #{showVersion version}|]

但输出是

代码语言:javascript
复制
Usage: MyProg [OPTION ...]
    \Version 0.1.0.0

Version字符串缩进得太远(仍然包含反斜杠)。我还在反斜杠和V之间添加了一个空格。

这和莎士比亚的课文有可能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-01 07:02:21

这看起来并不难,但是自己添加这个特性并不难。lt只是一个QuasiQuoter,它是数据类型:

代码语言:javascript
复制
QuasiQuoter {
   quoteExp :: String -> Q Exp
 , quotePat :: String -> Q Pat
 , quoteType :: String -> Q Type
 , quoteDec :: String -> Q [Dec]
}

它们接受一个String,并返回适当的模板haskell类型(取决于在其中使用的上下文)。

转换字符串是一件很简单的事情,因此它可以像您用regex描述的那样工作:

代码语言:javascript
复制
stripWhiteSpaceBeforeBackslash :: String -> String
stripWhiteSpaceBeforeBackslash str = subRegex (mkRegex "^[[:space:]]*\\\\") str ""

此外,使用字符串转换函数转换QuasiQuoter的函数很简单:

代码语言:javascript
复制
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版本,它可以满足您的需要:

代码语言:javascript
复制
lt_ = transformQuasiQuoter stripWhiteSpaceBeforeBackslash lt

使用它如预期的那样工作:

代码语言:javascript
复制
programName = "SomeProgram"
showVersion _ = "42.42.42"
version = 34

x = [lt_|Usage: #{programName} [OPTIONS...]
        \Version #{showVersion version}|]

x在ghci中计算为"Usage: SomeProgram [OPTIONS...]\nVersion 42.42.42"

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18553131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档