Haskell readP 中的 <* 有何作用?

Pis*_*tor 2 monads parsing haskell functional-programming

<*我在 Haskell库中遇到过readP几次,但我还不确定它的作用,并且在库文档中找不到它。与 一样吗<++

Wil*_*sem 7

(<*) :: 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是关于选择的,您提供两个选择作为解析器,并且首先尝试运行左侧解析器,如果失败则运行第二个解析器。但在这里,如果第一个解析器匹配,它永远不会为流的其余部分运行第二个解析器。