ouzo2:code$ ghci GHCi, version 8.2.2: http://www.haskell.org/ghc/ :? for help Loaded GHCi configuration from /Users/hallgren/.ghci Prelude> :l ParsingExamples.hs [1 of 2] Compiling Parsing ( Parsing.hs, interpreted ) [2 of 2] Compiling ParsingExamples ( ParsingExamples.hs, interpreted ) Ok, two modules loaded. *ParsingExamples> takeWhile isDigit "123+456" "123" *ParsingExamples> dropWhile isDigit "123+456" "+456" *ParsingExamples> span isDigit "123+456" ("123","+456") *ParsingExamples> span isDigit "a+123+456" ("","a+123+456") *ParsingExamples> :r [2 of 2] Compiling ParsingExamples ( ParsingExamples.hs, interpreted ) Ok, two modules loaded. *ParsingExamples> number_v1 "12+34" Just (12,"+34") *ParsingExamples> number_v1 "12asdf" Just (12,"asdf") *ParsingExamples> number_v1 "12" Just (12,"") *ParsingExamples> number_v1 "x+12" Nothing *ParsingExamples> :r [2 of 2] Compiling ParsingExamples ( ParsingExamples.hs, interpreted ) Ok, two modules loaded. *ParsingExamples> addition_v1 "12+34" Just (46,"") *ParsingExamples> addition_v1 "12+34kasjhdf" Just (46,"kasjhdf") *ParsingExamples> addition_v1 "12+" Nothing *ParsingExamples> addition_v1 "" Nothing *ParsingExamples> addition_v1 "x+1" Nothing *ParsingExamples> addition_v1 "12" *** Exception: ParsingExamples.hs:(32,17)-(36,36): Non-exhaustive patterns in case *ParsingExamples> :r [2 of 2] Compiling ParsingExamples ( ParsingExamples.hs, interpreted ) Ok, two modules loaded. *ParsingExamples> addition_v1 "12" Nothing *ParsingExamples> addition_v1 "12+345" Just (357,"") *ParsingExamples> :r [2 of 2] Compiling ParsingExamples ( ParsingExamples.hs, interpreted ) Ok, two modules loaded. *ParsingExamples> calculation_v1 "12+34" Just (46,"") *ParsingExamples> calculation_v1 "3*4" Just (12,"") *ParsingExamples> calculation_v1 "3+4" Just (7,"") *ParsingExamples> calculation_v1 "3/4" Nothing *ParsingExamples> calculation_v1 "3*4+4" Just (12,"+4") *ParsingExamples> :t map map :: (a -> b) -> [a] -> [b] *ParsingExamples> :t fmap fmap :: Functor f => (a -> b) -> f a -> f b *ParsingExamples> :t (<$>) (<$>) :: Functor f => (a -> b) -> f a -> f b *ParsingExamples> :r [2 of 2] Compiling ParsingExamples ( ParsingExamples.hs, interpreted ) Ok, two modules loaded. *ParsingExamples> :t digit digit :: Parser Char *ParsingExamples> :t oneOrMore digit oneOrMore digit :: Parser [Char] *ParsingExamples> :t read <$> oneOrMore digit read <$> oneOrMore digit :: Read b => Parser b *ParsingExamples> :r [2 of 2] Compiling ParsingExamples ( ParsingExamples.hs, interpreted ) Ok, two modules loaded. *ParsingExamples> :t parse parse :: Parser a -> String -> Maybe (a, String) *ParsingExamples> parse number "12+34" Just (12,"+34") *ParsingExamples> parse addition "12+34" Just (46,"") *ParsingExamples> :r [2 of 2] Compiling ParsingExamples ( ParsingExamples.hs, interpreted ) Ok, two modules loaded. *ParsingExamples> parse calculation "3+4" Just (7,"") *ParsingExamples> parse calculation "3*4" Just (12,"") *ParsingExamples> parse calculation "3*4alksj" Just (12,"alksj") *ParsingExamples> parse calculation "3*" Nothing *ParsingExamples> parse calculation "3" Nothing *ParsingExamples> parse calculation "" Nothing *ParsingExamples> parse calculation "asdkfj" Nothing *ParsingExamples> :r [2 of 2] Compiling ParsingExamples ( ParsingExamples.hs, interpreted ) Ok, two modules loaded. *ParsingExamples> parse calculation "3*4" Just (12,"") *ParsingExamples> parse calculation "3+4" Just (7,"") *ParsingExamples> fold foldMap foldl foldl1 foldr foldr1 *ParsingExamples> :t foldr1 foldr1 :: Foldable t => (a -> a -> a) -> t a -> a *ParsingExamples> foldr1 Add [Num 1,Num 2,Num 3] Add (Num 1) (Add (Num 2) (Num 3)) *ParsingExamples> foldl1 Add [Num 1,Num 2,Num 3] Add (Add (Num 1) (Num 2)) (Num 3) *ParsingExamples> :r [2 of 2] Compiling ParsingExamples ( ParsingExamples.hs, interpreted ) ParsingExamples.hs:127:31: error: Variable not in scope: t :: Expr | 127 | return (foldl1 Mul (t:ts)) | ^ ParsingExamples.hs:127:33: error: • Variable not in scope: ts :: [Expr] • Perhaps you meant ‘fs’ (line 126) | 127 | return (foldl1 Mul (t:ts)) | ^^ Failed, one module loaded. *Parsing> :r [2 of 2] Compiling ParsingExamples ( ParsingExamples.hs, interpreted ) Ok, two modules loaded. *ParsingExamples> parse expr "1+2*3" Just (Add (Num 1) (Mul (Num 2) (Num 3)),"") *ParsingExamples> parse expr "(1+2)*3" Just (Mul (Add (Num 1) (Num 2)) (Num 3),"") *ParsingExamples> parse expr "(1+2)*x" Just (Add (Num 1) (Num 2),"*x") *ParsingExamples> parse expr "(1+2)*" Just (Add (Num 1) (Num 2),"*") *ParsingExamples> parse expr "(1+2" Nothing *ParsingExamples> parse expr "(1+2)*3+4+5+6" Just (Add (Add (Add (Mul (Add (Num 1) (Num 2)) (Num 3)) (Num 4)) (Num 5)) (Num 6),"") *ParsingExamples> parse expr "(1+2)*3+4+5+6*4" Just (Add (Add (Add (Mul (Add (Num 1) (Num 2)) (Num 3)) (Num 4)) (Num 5)) (Mul (Num 6) (Num 4)),"") *ParsingExamples> eval <$> parse expr "(1+2)*3+4+5+6*4" :61:10: error: • Couldn't match type ‘(Expr, String)’ with ‘Expr’ Expected type: Maybe Expr Actual type: Maybe (Expr, String) • In the second argument of ‘(<$>)’, namely ‘parse expr "(1+2)*3+4+5+6*4"’ In the expression: eval <$> parse expr "(1+2)*3+4+5+6*4" In an equation for ‘it’: it = eval <$> parse expr "(1+2)*3+4+5+6*4" *ParsingExamples> (eval . fst) <$> parse expr "(1+2)*3+4+5+6*4" Just 42 *ParsingExamples> (eval . fst) <$> parse expr "(1+2)*3" Just 9 *ParsingExamples> parse expr "(1+2)*3" Just (Mul (Add (Num 1) (Num 2)) (Num 3),"") *ParsingExamples> :r [2 of 2] Compiling ParsingExamples ( ParsingExamples.hs, interpreted ) Ok, two modules loaded. *ParsingExamples> :r [2 of 2] Compiling ParsingExamples ( ParsingExamples.hs, interpreted ) Ok, two modules loaded. *ParsingExamples> parse expr "1+2*3" Just (Add (Num 1) (Mul (Num 2) (Num 3)),"") *ParsingExamples> parse expr "1+2*3+4" Just (Add (Add (Num 1) (Mul (Num 2) (Num 3))) (Num 4),"") *ParsingExamples> parse expr "(1+2)*3+4" Just (Add (Mul (Add (Num 1) (Num 2)) (Num 3)) (Num 4),"") *ParsingExamples> parse expr "(1+2)*(3+4)" Just (Mul (Add (Num 1) (Num 2)) (Add (Num 3) (Num 4)),"") *ParsingExamples> :r [2 of 2] Compiling ParsingExamples ( ParsingExamples.hs, interpreted ) Ok, two modules loaded. *ParsingExamples> main Welcome to the simple calculator! Expression? 1+2+3 Value: 6 Expression? 1+2*3 Value: 7 Expression? (1+2)*3 Value: 9 Expression? (1+ Syntax error! Expression? 1+2ajsd Syntax error! Expression? ^CInterrupted. *ParsingExamples> Leaving GHCi. ouzo2:code$