私は自分でスキームを書くチュートリアルに取り組んでいます.1つのコードブロックを見て、バインドと代入の違いについて疑問に思いました:
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
これが何を意味するのか正確にはわかりませんが、これはおそらくまたは モナドの不正確な理解によるものです。(私はHaskell の学習を他のさまざまなモナド/do チュートリアルと一緒に読んだことがあります。他の SO の質問では、インデントがここで問題を引き起こすことがよくあることに注意してください。ただし、正しくインデントしていると思います)