Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
pp:2023:haskell:l10 [2023/05/13 15:43] alexia.ciuclea |
pp:2023:haskell:l10 [2023/05/15 19:15] (current) tpruteanu |
||
|---|---|---|---|
| Line 48: | Line 48: | ||
| <code haskell> | <code haskell> | ||
| mminus :: Maybe Nat -> Maybe Nat -> Maybe Nat | mminus :: Maybe Nat -> Maybe Nat -> Maybe Nat | ||
| - | mminus m n = ??? | + | mminus m n = undefined |
| mplus :: Maybe Nat -> Maybe Nat -> Maybe Nat | mplus :: Maybe Nat -> Maybe Nat -> Maybe Nat | ||
| - | mplus m n = ??? | + | mplus m n = undefined |
| </code> | </code> | ||
| Line 57: | Line 57: | ||
| <code haskell> | <code haskell> | ||
| mmulti :: Maybe Nat -> Maybe Nat -> Maybe Nat | mmulti :: Maybe Nat -> Maybe Nat -> Maybe Nat | ||
| - | mmulti m n = ??? | + | mmulti m n = undefined |
| </code> | </code> | ||
| - | ===== 10.3. Implementing our 'Parser' ===== | + | ===== 10.2. Implementing our 'Parser' ===== |
| Firstly we need to understand the role of our parser. | Firstly we need to understand the role of our parser. | ||
| Given the type: | Given the type: | ||
| Line 99: | Line 99: | ||
| charParser :: Char -> Parser Char | charParser :: Char -> Parser Char | ||
| - | charParser c = ??? | + | charParser c = undefined |
| </code> | </code> | ||
| Line 105: | Line 105: | ||
| <code haskell> | <code haskell> | ||
| predicateParser :: (Char -> Bool) -> Parser Char | predicateParser :: (Char -> Bool) -> Parser Char | ||
| - | predicateParser p = ??? | + | predicateParser p = undefined |
| </code> | </code> | ||
| Line 139: | Line 139: | ||
| x -> x | x -> x | ||
| </code> | </code> | ||
| - | </hidden> | + | </hidden>\\ |
| + | \\ | ||
| Here we have built our Parser Monad, made it an Applicative, Functor and Alternative. Alternative type-class allows us to switch between parsers in case one fails. This will be needed later in the exercises. Applicative type-class is necessary, but shall be excluded from our discussion. | Here we have built our Parser Monad, made it an Applicative, Functor and Alternative. Alternative type-class allows us to switch between parsers in case one fails. This will be needed later in the exercises. Applicative type-class is necessary, but shall be excluded from our discussion. | ||
| Line 145: | Line 146: | ||
| <code haskell> | <code haskell> | ||
| varP :: Parser String | varP :: Parser String | ||
| - | varP = ??? | + | varP = undefined |
| </code> | </code> | ||
| Line 159: | Line 160: | ||
| plusParser :: (Parser a) -> Parser [a] | plusParser :: (Parser a) -> Parser [a] | ||
| - | plusParser p = ??? | + | plusParser p = undefined |
| starParser :: (Parser a) -> Parser [a] | starParser :: (Parser a) -> Parser [a] | ||
| - | starParser p = ??? | + | starParser p = undefined |
| </code> | </code> | ||
| Line 170: | Line 171: | ||
| <code haskell> | <code haskell> | ||
| varParser :: Parser String | varParser :: Parser String | ||
| - | varParser = ??? | + | varParser = undefined |
| varExprParser :: Parser Expr | varExprParser :: Parser Expr | ||
| - | varExprParser = ??? | + | varExprParser = undefined |
| </code> | </code> | ||
| Line 179: | Line 180: | ||
| <code haskell> | <code haskell> | ||
| whitespaceParser :: Parser String | whitespaceParser :: Parser String | ||
| - | whitespaceParser = ??? | + | whitespaceParser = undefined |
| </code> | </code> | ||
| Line 185: | Line 186: | ||
| <code haskell> | <code haskell> | ||
| exprParser :: Parser Expr | exprParser :: Parser Expr | ||
| - | exprParser = ??? | + | exprParser = undefined |
| </code> | </code> | ||