我很新的Haskell和我想了解使用此文档中创建单子解析器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)
这似乎是工作,但我有以下什么是做记号事情很难。
例如;在c1 <- item
中,分配给c1
的是什么?它是包含在Parser
类型中的函数,还是该计算的结果,还是其他?此外,第二行符号只是item
,所以它只是运行item
但不分配结果?最后,return (c1,c2)
产生了什么?是Parser (String -> Maybe ((c1, c2)), String)
还是Just (c1, c2)
?