Haskell:如何为解析器实现>>=

Haskell: How to implement >>= for a parser

我有以下解析器

newtype Parser a = P (String -> [(a,String)])

并且我需要在其作为 Monad 的实现上实现绑定。我有 return 定义为

instance Monad Parser where
    return v = P (\inp -> [(v,inp)])

实现p >>= f我知道的很多:p是一个Parser对象,f有类型声明

f :: a -> Parser b

所以我认为 p >>= f 的值需要是一个包装函数的 Parser 对象。该函数的参数是一个字符串。所以我猜这个函数应该 "open up p",得到它的函数,将它应用到输入字符串,得到一个 [(a, String)] 类型的对象,然后......我想也许应用 f 到每个元组中的每个第一个坐标,然后使用生成的解析器函数并将其应用于第二个坐标......并列出所有这些元组?

在这一点上,我对我是否做对了以及如果做对了如何去做感到很困惑。也许我应该写一个

类型的辅助函数
trans :: [(a,String)] -> (a -> Parser b) -> [(b,String)]

但在开始之前,我想检查一下我对自己应该做什么的混乱描述是否属实。

instance Monad Parser where
    return v = P (\inp -> [(v,inp)])
    P p >>= f = P (\inp -> do
        (x,u) <- p inp
        let P q = f x
        q u
        )