- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在弄清楚如何使用 Text.Parsec.Indent
中的任何功能时遇到问题 indents
提供的模块Haskell 的包,它是 Parsec 的一种附加组件。
所有这些功能有什么作用?它们将如何使用?
我能理解 withBlock
的简短黑线鳕描述,并且我找到了如何使用 withBlock
的示例, runIndent
和 IndentParser
类型 here , here和 here .我也能看懂四个解析器的文档 indentBrackets
and friends .但是很多事情仍然让我感到困惑。
特别是:
withBlock f a p
有什么区别和do aa <- a
pp <- block p
return f aa pp
withBlock' a p
和有什么区别?和 do {a; block p}
indented
and friends ,什么是“引用水平”?也就是说,什么是“引用”? indented
friend 们,如何使用呢?除了 withPos
,看起来它们没有参数并且都是 IParser ()
类型(IParser 定义为 this 或 this )所以我猜他们所能做的就是是否产生错误,并且它们应该出现在 do
中块,但我无法弄清楚细节。withPos
用法的例子。在 source code ,所以如果我盯着它看的时间足够长,我可能会弄清楚。 <+/>
附带有用的说明“<+/>
缩进敏感解析器是什么ap
is to monads”,如果你想花几个时间来尝试围绕你的头脑,这很好ap
然后找出它与解析器的相似之处。其他 three combinators然后引用 <+/>
定义,使整个团队对新人来说难以接近。do
反而? lexeme
组合器和 whiteSpace
Parsec 的解析器会很高兴地在多 token 构造中间消耗换行符,而不会提示。但是在缩进风格的语言中,有时你想停止解析词法结构或在一行被破坏并且下一行缩进少于它应该的时候抛出一个错误。我如何在 Parsec 中做到这一点? 最佳答案
所以,第一个提示是看看IndentParser
type IndentParser s u a = ParsecT s u (State SourcePos) a
ParsecT
密切关注
SourcePos
,一个抽象容器,可用于访问当前列号等。因此,它可能将当前的“缩进级别”存储在
SourcePos
中。 .这将是我对“引用水平”意味着什么的初步猜测。
indents
给你一种全新的
Parsec
这是上下文敏感的——特别是对当前缩进敏感。我会乱序回答你的问题。
State
部分使用
initialPos
我们可以修改。在代码中
import Text.Parsec
import Text.Parsec.Pos
import Text.Parsec.Indent
import Control.Monad.State
testParse :: (SourcePos -> SourcePos)
-> IndentParser String () a
-> String -> Either ParseError a
testParse f p src = fst $ flip runState (f $ initialPos "") $ runParserT p () "" src
runIndent
,除了我给了一个后门来修改
initialPos
。)
indented
.通过检查来源,我可以看出它有两件事。首先,它会
fail
如果当前
SourcePos
列号小于或等于
SourcePos
中存储的“引用级别”存储在
State
.其次,它有点神秘地更新了
State
SourcePos
的行计数器(不是列计数器)是当前的。
>>> testParse id indented ""
Left (line 1, column 1): not indented
>>> testParse id (spaces >> indented) " "
Right ()
>>> testParse id (many (char 'x') >> indented) "xxxx"
Right ()
indented
成功,我们需要消耗足够的空白(或其他任何东西!)以将我们的列位置推出超过“引用”列位置。否则,它将无法说“未缩进”。接下来的三个函数存在类似的行为:
same
除非当前位置和引用位置在同一条线上,否则失败,
sameOrIndented
如果当前列严格小于引用列,则失败,除非它们在同一行,并且
checkIndent
除非当前列和引用列匹配,否则失败。
withPos
略有不同。这不仅仅是一个
IndentParser
,这是一个
IndentParser
-combinator——它转换输入
IndentParser
认为“引用列”(
SourcePos
中的
State
)正是我们调用时的位置
withPos
.
block
和
withBlock
使用我们新的、较低级别的引用列运算符工作。
withBlock
根据
block
实现,所以我们将从
block
开始.
-- simplified from the actual source
block p = withPos $ many1 (checkIndent >> p)
block
将“引用列”重置为当前列的任何内容,然后从
p
消耗至少 1 次解析只要每一个都与这个新设置的“引用列”的缩进相同。现在我们可以看看
withBlock
withBlock f a p = withPos $ do
r1 <- a
r2 <- option [] (indented >> block p)
return (f r1 r2)
a
解析,尝试解析
indented
block
的
p
s,然后使用
f
组合结果.您的实现几乎是正确的,只是您需要使用
withPos
选择正确的“引用栏”。
withBlock
,
withBlock' = withBlock (\_ bs -> bs)
.
indented
和 friend 正是这样做的工具:如果相对于
withPos
选择的“引用位置”缩进不正确,它们将导致解析立即失败。 .
Applicative
style 之前不要担心这些家伙。解析基数
Parsec
.它通常是一种更清晰、更快、更简单的指定解析的方法。有时它们甚至更强大,但如果您了解
Monad
s 那么它们几乎总是完全等价的。
withPos
描述您想要的缩进时才会导致缩进失败。 .很快,我认为不可能指定
withPos
基于其他解析的成功或失败......所以你必须更深入另一个层次。幸运的是,机制使得
IndentParser
的工作是显而易见的——它只是一个内在的
State
单子(monad)包含
SourcePos
.您可以使用
lift :: MonadTrans t => m a -> t m a
操纵这个内部状态并设置“引用列”,但是你喜欢。
关于parsing - Haskell/Parsec : How do you use the functions in Text. Parsec.Indent?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15549050/
main.cpp #include "Primes.h" #include int main(){ std::string choose; int num1, num2; w
似乎函数 qwertyInches() 应该可以工作但是当我在 main() 中调用它时它给了我 [Error] called object 'qwertyInches' is not a funct
我无法理解 C++ 语法的工作原理。 #include using namespace std; class Accumulator{ private: int value; public:
在 类中声明 函数成员时,我们可以同时执行这两种操作; Function first; Function() second; 它们之间有什么区别? 最佳答案 Function 代表任意函数: void
“colonna”怎么可能是一个简单的字符串: $('td.' + colonna).css('background-color','#ffddaa'); 可以正确突出显示有趣单元格的背景,并且: $
我正在尝试将网页中的动态参数中继到函数中,然后函数将它们传递给函数内部的调用。比如下面这个简化的代码片段,现在这样,直接传入参数是没有问题的。但是,如何在不为每个可能的 colorbox 参数设置 s
C++ 中是否有一种模式允许您返回一个函数,它返回一个函数本身。例如 std::function func = ...; do { func = func(); } while (func);
我正在将 Windows 程序集移植到 Linux。我有一些代码要移植。我实际上是 linux 中 C 的新手。我知道 C 基础知识是一样的! typedef struct sReader {
我一直在寻找一个很好的解释,所以我很清楚。示例: this.onDeleteHandler(index)}/> 对比 对比 this.nameChangedhandler(event, perso
function(){}.__proto__ === Function.prototype 和 Function.prototype === function(){}.__proto__ 得到不同的结
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function 据说 Propert
VBA 中的函数没有特殊类型。我很难理解如何在 Excel VBA 中将函数作为参数添加到函数中。 我想要完成的是这样的事情: function f(g as function, x as strin
所以我正在尝试制作一个包(我没有在下面包含我的 roxygen2 header ): 我有这个功能: date_from_text % dplyr::mutate(!!name := lubr
尝试从 std::function 派生一个类,对于初学者来说,继承构造函数。这是我的猜测: #include #include using namespace std; template cla
我正在尝试编写一个返回另一个函数的函数。我的目标是编写一个函数,它接受一个对象并返回另一个函数“search”。当我使用键调用搜索函数时,我想从第一个函数中给定的对象返回该键的值。 propertyO
我非常清楚函数式编程技术和命令式编程技术之间的区别。但是现在有一种普遍的趋势是谈论“函数式语言”,这确实让我感到困惑。 当然,像 Haskell 这样的一些语言比 C 等其他语言更欢迎函数式编程。但即
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 8 年前。 Improv
我在stackoverflow上查过很多类似的问题,比如call.call 1 , call.call 2 ,但我是新人,无法发表任何评论。我希望我能找到关于 JavaScript 解释器如何执行这些
向 Twilio 发送 SMS 时,Twilio 会向指定的 URL 发送多个请求,以通过 Webhook 提供该 SMS 传送的状态。我想让这个回调异步,所以我开发了一个 Cloud Functio
作为 IaC 的一部分,A 功能应用 ,让我们将其命名为 FuncAppX 是使用 Terraform 部署的,它有一个内置函数。 我需要使用 Terraform 在函数应用程序中访问相同函数的 Ur
我是一名优秀的程序员,十分优秀!