Pis*_*tor 2 monads parsing haskell functional-programming
<*我在 Haskell库中遇到过readP几次,但我还不确定它的作用,并且在库文档中找不到它。与 一样吗<++?
(<*) :: Applicative f => f a -> f b -> f a并不特定于ReadP,它是 或 的一部分Applicative,并且本质上可以归结为:
f <* g = do
y <- f
g
pure y
Run Code Online (Sandbox Code Playgroud)
但这是,除非使用ApplicativeDofor monad。但这很清楚地表明正在发生什么。
在幕后它的实现方式如下:
f <* g = liftA2 const f g
Run Code Online (Sandbox Code Playgroud)
所以它“合并”两个Applicative f => f as,并且通过使用const,它将采用第一项,而不是第二项。
因此,它使用左操作数,然后使用右操作数,并返回第一个操作数的结果。
在 的上下文中ReadP,它将运行左侧解析器,然后运行右侧解析器,然后忽略右侧解析器的结果并返回第一个解析器。
例如:
get <* get
Run Code Online (Sandbox Code Playgroud)
它将读取两个字符,并返回第一个解析的字符,因此忽略(但解析)正确的字符。
这(<++) :: ReadP a -> ReadP a -> ReadP是关于选择的,您提供两个选择作为解析器,并且首先尝试运行左侧解析器,如果失败则运行第二个解析器。但在这里,如果第一个解析器匹配,它永远不会为流的其余部分运行第二个解析器。