我有以下解析器
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)]
但是在开始讨论之前,我想检查一下我对应该做的事情的混淆描述是否正确。
答案 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
)