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
)
我有以下解析器
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
)