我正在学习编写自己的方案教程,一个代码块让我想知道绑定和赋值之间的区别:
 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
我无法准确理解这意味着什么,这可能是由于对domonad 的不精确理解。(我已经阅读了 Learn You a Haskell以及其他各种 monad/do 教程,并且其他 SO 问题指出缩进通常会导致这里出现问题,但我认为我的缩进是正确的)