Skip to content

Commit 9648826

Browse files
committed
Add comments on parsers derived from other parsers
1 parent a023af8 commit 9648826

File tree

1 file changed

+46
-27
lines changed

1 file changed

+46
-27
lines changed

13-monadic-parsing/13.06-derived-primitives.hs

Lines changed: 46 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,84 +12,103 @@ item = P $ \inp ->
1212
[] -> []
1313
(x:xs) -> [(x, xs)]
1414

15-
instance Functor Parser where
16-
fmap f p = P $ \inp ->
17-
case parse p inp of
18-
[] -> []
19-
[(v, out)] -> [(f v, out)]
20-
21-
instance Applicative Parser where
22-
pure v = P $ \inp -> [(v, inp)]
23-
24-
pf <*> px = P $ \inp ->
25-
case parse pf inp of
26-
[] -> []
27-
[(f, out)] -> parse (fmap f px) out
28-
29-
instance Monad Parser where
30-
p >>= f = P $ \inp ->
31-
case parse p inp of
32-
[] -> []
33-
[(v, out)] -> parse (f v) out
34-
35-
instance Alternative Parser where
36-
empty = P $ \inp -> []
37-
38-
p <|> q = P $ \inp ->
39-
case parse p inp of
40-
[] -> parse q inp
41-
[(v, out)] -> [(v, out)]
15+
-- | Three basic parsers: `item`, `return v`, and `empty`.
4216

17+
-- | Succeeds for Single characters that satify the predicate function `p`.
4318
sat :: (Char -> Bool) -> Parser Char
4419
sat p = do
4520
x <- item
4621
if p x
4722
then return x
4823
else empty
4924

25+
-- | The `digit` parser is defined for single digits.
5026
digit :: Parser Char
5127
digit = sat isDigit
5228

29+
-- | The `lower` parser is defined for lower-case letters.
5330
lower :: Parser Char
5431
lower = sat isLower
5532

33+
-- | The `upper` parser is defined for upper-case letters.
5634
upper :: Parser Char
5735
upper = sat isUpper
5836

37+
-- | The `letter` parser is defined for arbitrary letters.
5938
letter :: Parser Char
6039
letter = sat isAlpha
6140

41+
-- | The `alphaum` parser is defined for alphanumerica characters.
6242
alphanum :: Parser Char
6343
alphanum = sat isAlphaNum
6444

45+
-- | The `char` parser is defined for specific characters.
6546
char :: Char -> Parser Char
6647
char x = sat (== x)
6748

49+
-- | The `string` parser is defined for the string of characters `xs`
50+
-- with the string itself returned as the result value and succeeds only if the
51+
-- entire target string is consumed from the input to the parser.
6852
string :: String -> Parser String
6953
string [] = return []
7054
string (x:xs) = do
7155
char x
7256
string xs
7357
return (x:xs)
7458

59+
-- | The `ident` parser is defined for strings comprising a lower-case letter
60+
-- followed by zero or more alphanueric characters
7561
ident :: Parser String
7662
ident = do
7763
x <- lower
7864
xs <- many alphanum
7965
return (x:xs)
8066

67+
-- | The `nat` parser is defined for natural numbers comprising one or more
68+
-- digits.
8169
nat :: Parser Int
8270
nat = do
8371
xs <- some digit
8472
return (read xs)
8573

74+
-- | The `space` parser is defined for spacing comprising zero or more space,
75+
-- tab, and newline characters.
8676
space :: Parser ()
8777
space = do
8878
many (sat isSpace)
8979
return ()
9080

81+
-- | The `int` parser is defined for integer values.
9182
int :: Parser Int
9283
int = do
9384
char '-'
9485
n <- nat
9586
return (-n) <|> nat
87+
88+
instance Functor Parser where
89+
fmap f p = P $ \inp ->
90+
case parse p inp of
91+
[] -> []
92+
[(v, out)] -> [(f v, out)]
93+
94+
instance Applicative Parser where
95+
pure v = P $ \inp -> [(v, inp)]
96+
97+
pf <*> px = P $ \inp ->
98+
case parse pf inp of
99+
[] -> []
100+
[(f, out)] -> parse (fmap f px) out
101+
102+
instance Monad Parser where
103+
p >>= f = P $ \inp ->
104+
case parse p inp of
105+
[] -> []
106+
[(v, out)] -> parse (f v) out
107+
108+
instance Alternative Parser where
109+
empty = P $ \inp -> []
110+
111+
p <|> q = P $ \inp ->
112+
case parse p inp of
113+
[] -> parse q inp
114+
[(v, out)] -> [(v, out)]

0 commit comments

Comments
 (0)