我正在尝试在 Haskell 中实现一个 RPN 计算器。这是Learn You a Haskell中的一个练习。这是我的代码:
import Data.List
solveRPN :: String -> Int
solveRPN str = head $ foldl putStack [] (words str)
where putStack accumulator token
| token == "+" = pFunction (+)
| token == "-" = pFunction (-)
| token == "*" = pFunction (*)
| token == "/" = pFunction (`div`)
| otherwise = accumulator ++ [read token :: Float]
where pFunction function = (int $ init accumulator) ++ [function argu1 argu2]
argu1 = last accumulator
argu2 = last $ init accumulator
该函数solveRPN
首先将字符串拆分为标记。(例如:"4 3 2 + *"
-> ["4","3","2","+","*"]
)然后,一个一个令牌被推入堆栈。如果遇到运算符,则堆栈中的最后两项由运算符处理,然后将产生的值放回堆栈中。当遍历整个列表时,堆栈中只剩下一项,这就是答案。
这里有一些问题:
在
(int $ init accumulator)
我想取消堆栈中的最后两个元素。有什么替代方法(int $ init accumulator)
吗?代码无法通过编译。GHC 说“输入时解析错误(”
在这一行:| token == "/" = pFunction (
div)
。我怀疑问题可能来自pFunction
。它的参数是一个运算符(或者我可以称它为函数吗?)我不确定“函数是否作为参数函数”在 Haskell 中是合法的。这合法吗?还有其他选择吗?我在 GHCi 中做了一些实验,发现了一些奇怪的东西:
Prelude> let plus = (+) Prelude> :t (+) (+) :: Num a => a -> a -> a Prelude> :t plus plus :: Integer -> Integer -> Integer
为什么加号的类型与(+)的类型不同?
感谢您的关注和耐心。(: