fork download
  1. import Data.Char
  2.  
  3. data Lexem = O Char | N Double
  4. deriving (Show)
  5.  
  6. getNumber x = _getNumber x 0.0
  7.  
  8. _getNumber [] n = (n, [])
  9. _getNumber l@(h:t) n
  10. | h == '.' = _getNumber2 1 t n
  11. | isDigit h = _getNumber t. (+) (digit h) $ 10 * n
  12. | otherwise = (n, l)
  13.  
  14. _getNumber2 d [] n = (n/d, [])
  15. _getNumber2 d l@(h:t) n
  16. | isDigit h = _getNumber2 (d*10) t. (+) (digit h) $ 10 * n
  17. | otherwise =(n, l)
  18.  
  19. digit = fromIntegral.digitToInt
  20.  
  21. recognize acc [] = acc
  22.  
  23. recognize acc l@(h:t)
  24. | elem h "+-/*()" = recognize (O h: acc) t
  25. | isDigit h = recognize (N (fst next) : acc) $ snd next
  26. | otherwise = recognize acc t
  27. where next = getNumber l
  28.  
  29. calc (x:acc) [] = (x,[])
  30. calc acc (O ')':t) = calc (fst next:acc) (snd next)
  31. where next = calc [] t
  32. calc (x:acc) (O '(':t) = (x,t)
  33. calc acc (N x:t) = calc (x:acc) t
  34. calc (x:y:acc) (O '+':t) = calc (x+y:acc) t
  35. calc (x:y:acc) (O '-':t) = calc (x-y:acc) t
  36. calc (x:y:acc) (O '/':t) = calc (x/y:acc) t
  37. calc (x:y:acc) (O '*':t) = calc (x*y:acc) t
  38.  
  39. calculate = fst.calc [].recognize []
  40.  
  41. main = print$ calculate "/ + 2 * 5 6 (- 10 2)"
  42.  
Success #stdin #stdout 0s 4596KB
stdin
Standard input is empty
stdout
4.0