逆波兰式的实现

  1. 数据结构

    data Lex = Number Double Lex
     | Plus Lex
     | Times Lex
     | End deriving Show
    
  2. 解析

    lexRPN :: String -> Lex
    lexRPN = go . words
     where 
      go ("*":rest) = Times (go rest)
      go ("+":rest) = Plus (go rest)
      go (num:rest) = Number (read num) (go rest)
      go [] = End
    
  3. 数据结构的语义

    evalRPN :: Lex -> Double
    evalRPN = go [] where
      go stack (Number num rest) = go (num : stack) rest
      go (o1:o2:stack) (Plus rest)= let r = o1 + o2 in r `seq` go (r : stack) rest
      go (o1:o2:stack) (Times rest)= let r = o1 * o2 in r `seq` go (r : stack) rest
      go [res] End = res 
    
  4. 测试

    ghci> lexRPN "3 1 2 + *"
    Number 3.0 (Number 1.0 (Number 2.0 (Plus (Times End))))
    ghci> evalRPN $ lexRPN "3 1 2 + *"
    9.0
    ghci> evalRPN $ lexRPN "5 6 2 + 7 * *"
    280.0
    ghci>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容