无法匹配类型 Maybe ([a], a0)

Couldn't match type Maybe ([a], a0)

我不明白为什么会收到此错误消息:

• Couldn't match type ‘Maybe ([a], a0)’
          with ‘String -> Maybe ([a1], String)’

我的代码:

type Parse a = String -> Maybe(a, String)

parseMany :: Parse a -> Parse [a]
parseMany p str = case p str of 
                    Nothing -> Just ([], str)
                    Just (z, str') -> case parseMany (z str') of
                                    Just (c, str'') ->  Just ((z : c), show (str''))

使用 z str' 没有意义,z 是类型 a 的对象,而不是可以接受 String 参数的函数。

您可以使用相同的基本解析器 p 来解析下一项:

parseMany :: Parse a -> Parse [a]
parseMany p str = case p str of 
    Nothing -> Just ([], str)
    Just (z, str') -> case parseMany p str' of
        Just (c, str'') ->  Just ((z : c), str'')
        Nothing -> Nothing

如果我们有一个像这样的简单解析器:

myParser :: Parse Int
myParser ('a':xs) = Just (1, xs)
myParser _ = Nothing

然后它将 'a' 的列表解析为:

ghci> parseMany myParser "aaaaaa"
Just ([1,1,1,1,1,1],"")