Parsing haskell中的简单解析器示例

Parsing haskell中的简单解析器示例,parsing,haskell,Parsing,Haskell,我有以下解析器函数 import Data.Char type Parser a = String -> [(a,String)] return' :: a -> Parser a return' v = \inp -> [(v,inp)] failure :: Parser a failure = \inp -> [] item :: Parser Char item = \inp -> case inp of [] -> []

我有以下解析器函数

import Data.Char
type Parser a = String -> [(a,String)]

return' :: a -> Parser a
return' v = \inp -> [(v,inp)]

failure :: Parser a
failure = \inp -> []

item :: Parser Char
item = \inp -> case inp of
         [] -> []
     (x:xs) -> [(x,xs)]

parse :: Parser a -> String -> [(a,String)]
parse p inp = p inp

parse :: Parser a -> String -> [(a,String)]
parse p inp = p inp

(+++) :: Parser a -> Parser a -> Parser a
p +++ q = \inp -> case parse p inp of
            [] -> parse q inp
     [(v,out)] -> [(v,out)]
到目前为止还不错,它们可以加载到ghci中。但是当我添加以下函数时

sat :: (Char -> Bool) -> Parser Char
sat p = do x <- item
           if p x then return x else failure
sat::(Char->Bool)->解析器Char

sat p=do x使用
do
块要求您的
解析器
Monad
类的实例。由于您的
解析器
类型是函数类型
String->[(a,String)]
的别名,并且函数不是
Monad
的实例,因此会出现错误。您可以不使用
do
符号编写函数:

sat :: (Char -> Bool) -> Parser Char
sat p [] = []
sat p (c:cs) = if p c then [(c, cs)] else []

sat
do
块中
x
的类型是
[(字符,字符串)]
。这是因为
item
的类型为
String->[(Char,String)]
(>)String[(Char,String)]
,并且您正在使用
Monad
实例来表示
(>)String
中“包含”的是
[(Char,String)]

如果我们删除
ScopedTypeVariables
,我们需要删除我为说明而添加的类型签名

sat :: (Char -> Bool) -> Parser Char
sat p = do x <- item
           return $ filter (p . fst) x
sat::(Char->Bool)->解析器Char

sat p=do x函数名为
return'
not
return
。我的错误,但我仍然得到一个错误,它是这样的:
没有(Monad((>)String)的实例由do语句
函数产生的是
Monad
的实例,或者从那时起就一直存在。在此之前,函数的
Monad
实例由
实例Monad((->)r)给出,其中return=const;f>=k=\r->k(fr)r
in。
sat :: (Char -> Bool) -> Parser Char
sat p = do (x :: [(Char, String)]) <- item
           return $ filter (p . fst) x
sat :: (Char -> Bool) -> Parser Char
sat p = do x <- item
           return $ filter (p . fst) x