【发布时间】:2015-04-22 17:25:52
【问题描述】:
我对 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 表示法中的第二行只是item,所以它只是运行item 但不分配结果吗?最后,return (c1,c2) 会产生什么?是Parser (String -> Maybe ((c1, c2)), String) 还是只是Just (c1, c2)?
【问题讨论】:
标签: haskell monads do-notation