首页 文章

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

提问于
浏览
0

我有以下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 回答

  • 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
            )
    

相关问题