使用Haskell构建一个简单的计算器应用程序
发布时间:2023-12-10 13:06:20
下面是一个使用Haskell构建的简单计算器应用程序的示例代码:
module Calculator where
-- 根据操作符计算两个数的结果
calculate :: Double -> Double -> String -> Maybe Double
calculate x y "+" = Just (x + y)
calculate x y "-" = Just (x - y)
calculate x y "*" = Just (x * y)
calculate x y "/" = if y == 0 then Nothing else Just (x / y)
calculate _ _ _ = Nothing
-- 解析用户输入的表达式
parseExpression :: String -> Maybe (Double, Double, String)
parseExpression expr = case words expr of
[x, op, y] -> case (reads x :: [(Double, String)], reads y :: [(Double, String)]) of
([(x', "")], [(y', "")]) -> Just (x', y', op)
_ -> Nothing
_ -> Nothing
-- 执行计算器应用程序的主循环
calculatorLoop :: IO ()
calculatorLoop = do
putStrLn "请输入一个表达式(例如 2 + 3)或者输入 'q' 离开:"
expr <- getLine
if expr == "q"
then putStrLn "再见!"
else case parseExpression expr of
Just (x, y, op) -> case calculate x y op of
Just result -> do
putStrLn $ "结果: " ++ show result
calculatorLoop
Nothing -> do
putStrLn "无效操作,请重试。"
calculatorLoop
Nothing -> do
putStrLn "无法解析表达式,请重试。"
calculatorLoop
-- 启动计算器应用程序
main :: IO ()
main = do
putStrLn "欢迎使用计算器!"
calculatorLoop
这个应用程序通过calculate函数来计算两个数的结果,并根据传入的操作符进行相应的计算。calculate函数的返回类型是Maybe Double,即可能返回一个计算结果或者返回Nothing,以处理除数为零等错误情况。
parseExpression函数用于解析用户输入的表达式,将字符串拆分成操作数和操作符部分,并将它们转换为浮点数。如果解析成功,则返回Just构造函数包装的三元组,包含两个操作数和一个操作符。如果解析失败,则返回Nothing。
calculatorLoop函数是程序的主循环,它反复提示用户输入表达式,并通过parseExpression进行解析和计算,将结果打印出来,并在计算失败或解析失败时给出相应提示。
最后,在main函数中,我们简单地输出欢迎信息,然后通过调用calculatorLoop函数启动计算器应用程序的主循环。
以下是程序的一个使用示例:
欢迎使用计算器! 请输入一个表达式(例如 2 + 3)或者输入 'q' 离开: 6 / 2 结果: 3.0 请输入一个表达式(例如 2 + 3)或者输入 'q' 离开: 8 - 5 结果: 3.0 请输入一个表达式(例如 2 + 3)或者输入 'q' 离开: 4 * 2 结果: 8.0 请输入一个表达式(例如 2 + 3)或者输入 'q' 离开: 10 / 0 无效操作,请重试。 请输入一个表达式(例如 2 + 3)或者输入 'q' 离开: 2 ^ 3 无法解析表达式,请重试。 请输入一个表达式(例如 2 + 3)或者输入 'q' 离开: q 再见!
通过这个简单的计算器应用程序,用户可以输入一个表达式,程序将解析表达式并计算结果。它处理了除以零等错误情况,同时具有友好的用户界面和错误提示。
