-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparser.hs
More file actions
37 lines (26 loc) · 844 Bytes
/
parser.hs
File metadata and controls
37 lines (26 loc) · 844 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
newtype Parser a = Parser (String -> [(a, String)])
apply :: Parser a -> String -> [(a, String)]
apply (Parser p) s = p s
parse :: Parser a -> String -> a
parse p = fst . head . apply p
instance Monad Parser where
return x = Parser (\s -> [(x,s)])
p >>= q = Parser (\s -> [(y,s'')
| (x, s') <- apply p s,
(y, s'') <- apply (q x) s'])
getc :: Parser Char
getc = Parser f
where f [] = []
f (c:cs) = [(c,cs)]
parseChar :: String -> Char
parseChar s = parse getc s
-- Experiment two
type Long = Bool
type Column = Bool
data LSArgs = LSArgs Long Column
newtype ParseArgs a = ParseArgs (String -> (a, String))
apply :: ParseArgs a -> String -> (a, String)
apply (ParseArgs p) s = p s
parse :: ParseArgs a -> String -> a
parse p = fst . head . apply p
main = putChar $ parse getc "Hello World"