私は haskell に非常に慣れていないので、このドキュメントhttps://www.cs.nott.ac.uk/~gmh/pearl.pdfで Monadic パーサーを作成するために使用される方法論を理解しようとしています。
正確に従うのではなく、正しく理解するために少し異なる方法で実行しようとしているため、最終的にこのコードになりました
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 表記の 2 行目は justitem
なので、実行するだけでitem
結果を代入しないのですか? 最後に、何return (c1,c2)
を生成しますか? それですか、Parser (String -> Maybe ((c1, c2)), String)
それともただJust (c1, c2)
ですか?