Create parser.hs
This commit is contained in:
parent
33e874d29f
commit
b98f25cab9
39
2016-04-18/parser.hs
Normal file
39
2016-04-18/parser.hs
Normal file
@ -0,0 +1,39 @@
|
||||
module Parser where
|
||||
|
||||
import qualified Data.Char as Char
|
||||
|
||||
newtype Parser i o = Parser (i -> Maybe (o, i))
|
||||
|
||||
instance Functor (Parser i) where
|
||||
fmap f (Parser p) = Parser $ \i -> fmap (\(o, i') -> (f o, i')) $ p i
|
||||
|
||||
instance Applicative (Parser i) where
|
||||
pure x = Parser $ \i -> Just (x, i)
|
||||
|
||||
Parser ff <*> Parser fv = Parser $ \i -> case ff i of
|
||||
Just (f, i') -> case fv i' of
|
||||
Just (v, i'') -> Just (f v, i'')
|
||||
Nothing -> Nothing
|
||||
Nothing -> Nothing
|
||||
|
||||
charParser :: Char -> Parser String Char
|
||||
charParser c = Parser $ \i -> case i of
|
||||
(x : xs) | x == c -> Just (c, xs)
|
||||
_ -> Nothing
|
||||
|
||||
newtype Digit = Digit { getIntOfDigit :: Int } deriving (Show, Eq, Ord)
|
||||
|
||||
charToDigit :: Char -> Maybe Digit
|
||||
charToDigit c =
|
||||
if Char.isDigit c then Just $ Digit (Char.digitToInt c) else Nothing
|
||||
|
||||
digitParser :: Parser String Digit
|
||||
digitParser = Parser $ \i -> case i of
|
||||
(c : cs) -> fmap (\d -> (d, cs)) . charToDigit $ c
|
||||
_ -> Nothing
|
||||
|
||||
numberParser :: Parser String Int
|
||||
numberParser = undefined
|
||||
|
||||
runParser :: i -> Parser i o -> Maybe o
|
||||
runParser i (Parser p) = fmap fst (p i)
|
Loading…
Reference in New Issue
Block a user