欢迎访问宙启技术站
智能推送

使用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
再见!

通过这个简单的计算器应用程序,用户可以输入一个表达式,程序将解析表达式并计算结果。它处理了除以零等错误情况,同时具有友好的用户界面和错误提示。