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

时间:2018-12-09 00:33:36

标签: parsing haskell monads

我有以下解析器

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

,我需要将其绑定作为Monad来实现。我有返回定义为

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

要实现p >>= f,我非常了解:p是一个解析器对象,而f具有类型声明

f :: a -> Parser b

因此,我认为p >>= f的值必须是一个包装函数的解析器对象。该函数的参数是一个字符串。因此,我猜测该函数应“打开p”,获取其函数,将其应用于输入字符串,获取类型为[(a,String)]的对象,然后...我想也许可以应用f到每个元组中的每个第一个坐标,然后使用生成的Parser函数并将其应用于第二个坐标...并列出所有这些元组?

在这一点上,我对是否正确以及如何做到这一点感到困惑。也许我应该用

类型编写一个辅助函数
trans :: [(a,String)] -> (a -> Parser b) -> [(b,String)]

但是在开始讨论之前,我想检查一下我对应该做的事情的混淆描述是否正确。

1 个答案:

答案 0 :(得分:1)

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
        )