我对 haskell 非常陌生,我正在尝试了解用于在本文档中创建 Monadic 解析器的方法https://www.cs.nott.ac.uk/~gmh/pearl.pdf
为了正确理解它,我没有完全遵循它,而是尝试做一些不同的事情,因此,我最终得到了这段代码
newtype Parser a = Parser (String -> Maybe (a, String))
item :: Parser Char
item = Parser (\cs -> case cs of
"" -> Nothing
(c:cs) -> Just (c, cs))
getParser (Parser x) = x
instance Monad Parser where
return x = Parser (\cs -> Just (x,cs))
(Parser p) >>= f = Parser (\cs -> let result = p cs in
case result of
Nothing -> Nothing
Just (c,cs') -> getParser (f c) cs')
takeThreeDropSecond :: Parser (Char, Char)
takeThreeDropSecond = do
c1 <- item
item
c2 <- item
return (c1, c2)
这似乎有效,但我很难理解 do 表示法中发生的事情。
例如; 在c1 <- item
,分配给c1
什么?它是包含在Parser
类型中的函数,还是计算的结果,还是其他什么?此外, do 表示法中的第二行是 just item
,所以它只是运行item
但不分配结果吗?最后,return (c1,c2)
产生什么?是Parser (String -> Maybe ((c1, c2)), String)
还是只是Just (c1, c2)
?