我有以下Parser
newtype Parser a = P (String -> [(a,String)])
我需要在Monad的实现上实现bind . 我知道返回被定义为
instance Monad Parser where
return v = P (\inp -> [(v,inp)])
要实现 p >>= f
我知道的很多: p
是一个Parser对象,f有类型声明
f :: a -> Parser b
所以我认为 p >>= f
的值需要是一个包装函数的Parser对象 . 那个函数's argument is a String. So I'猜测函数应该“打开 p
”,得到它的函数,将它应用到输入字符串,得到一个类型为[(a,String)]的对象,然后......我猜想也许应用 f
到每个第一个在每个元组中进行坐标,然后使用生成的Parser函数并将其应用于第二个坐标...并列出所有这些元组的列表?
在这一点上,我对自己是否做到这一点非常迷茫,如果是这样,那该怎么做 . 也许我应该写一个类型的辅助函数
trans :: [(a,String)] -> (a -> Parser b) -> [(b,String)]
但在进入之前,我想检查一下我对应该做什么的困惑描述是否真实 .
1 回答