Skip to content

Commit 1ac7c14

Browse files
committed
Part 2 chapter 13 - part 4, alternative.
1 parent 0a7a21a commit 1ac7c14

File tree

1 file changed

+15
-1
lines changed

1 file changed

+15
-1
lines changed

part2_chapter13_parser/Main.hs

+15-1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,15 @@ instance Monad Parser where
3535
[] -> []
3636
[(value, out)] -> parse (functionToParser value) out)
3737

38+
instance Alternative Parser where
39+
-- empty :: Parser a
40+
empty = P (\inp -> [])
41+
42+
-- (<|>) :: Parser a -> Parser a -> Parser a
43+
p <|> q = P (\inp -> case parse p inp of
44+
[] -> parse q inp
45+
[(v, out)] -> [(v, out)])
46+
3847
parse :: Parser a -> String -> [(a, String)]
3948
parse (P p) inp = p inp
4049

@@ -74,4 +83,9 @@ main = do
7483
putStrLn "Monad:"
7584
putStrLn . show $ parse (return '1') "abc"
7685
putStrLn . show $ parse (item >>= (\x -> crappyParser)) "abcdef"
77-
putStrLn . show $ parse (item >>= uselessParser) "abcdef"
86+
putStrLn . show $ parse (item >>= uselessParser) "abcdef"
87+
88+
putStrLn "Alternative:"
89+
putStrLn . show $ ((parse empty "abc") :: [(String, String)])
90+
putStrLn . show $ parse (item <|> return 'd') "abc"
91+
putStrLn . show $ parse (empty <|> return 'd') "abc"

0 commit comments

Comments
 (0)