我正在学习编写自己的方案教程,一个代码块让我想知道绑定和赋值之间的区别:
parseAtom = do first <- letter <|> symbol
rest <- many (letter <|> digit <|> symbol)
let atom = first:rest
return $ case atom of
"#t" -> Bool True
"#f" -> Bool False
_ -> Atom atom
为什么let atom =
而不是atom <-
?因此,我尝试了:
parseAtom = do first <- letter <|> symbol
rest <- many (letter <|> digit <|> symbol)
atom <- first : rest
return $ case atom of
"#t" -> Bool True
"#f" -> Bool False
_ -> Atom atom
我得到编译错误:
Couldn't match expected type `[Char]'
against inferred type `Text.Parsec.Prim.ParsecT
String () Data.Functor.Identity.Identity Char'
In a stmt of a 'do' expression: atom <- first : rest
我无法准确理解这意味着什么,这可能是由于对do
monad 的不精确理解。(我已经阅读了 Learn You a Haskell以及其他各种 monad/do 教程,并且其他 SO 问题指出缩进通常会导致这里出现问题,但我认为我的缩进是正确的)