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'
notreturn
。我的错误,但我仍然得到一个错误,它是这样的:没有(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