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

使用Haskell开发一个简单的命令行计算器

发布时间:2023-12-10 12:20:57

下面是一个简单的命令行计算器的Haskell实现。该计算器支持四则运算和括号,并可以处理大整数。

import Text.Read (readMaybe)
import Data.Maybe (fromMaybe)

-- 定义表达式类型
data Expr = Const Integer
          | Add Expr Expr
          | Sub Expr Expr
          | Mul Expr Expr
          | Div Expr Expr
          | Paren Expr

-- 解析输入字符串为表达式
parseExpr :: String -> Maybe Expr
parseExpr = parse . words
  where
    parse (x:xs) = parse' xs (Const <$> readMaybe x)
    parse []     = Nothing

    parse' (op:num:ys) (Just x) = parse'' op ys (Const x) (Const <$> readMaybe num)
    parse' _          _         = Nothing

    parse'' op ys lhs (Just rhs) = case op of
      "+" -> parse' ys (Just $ Add lhs rhs)
      "-" -> parse' ys (Just $ Sub lhs rhs)
      "*" -> parse' ys (Just $ Mul lhs rhs)
      "/" -> parse' ys (Just $ Div lhs rhs)
      _   -> Nothing
    parse'' _ _ _ _ = Nothing

-- 计算表达式结果
eval :: Expr -> Maybe Integer
eval (Const n)   = Just n
eval (Add a b)   = (+) <$> eval a <*> eval b
eval (Sub a b)   = (-) <$> eval a <*> eval b
eval (Mul a b)   = (*) <$> eval a <*> eval b
eval (Div a b)   = div <$> eval a <*> eval b
eval (Paren e)   = eval e

-- 打印表达式结果
printResult :: Maybe Integer -> IO ()
printResult = putStrLn . fromMaybe "Invalid expression." . fmap show

-- 主函数
main :: IO ()
main = do
  putStr "Enter an expression: "
  input <- getLine
  let expr = parseExpr input
  let result = eval =<< expr
  printResult result

以下是一些使用例子:

输入:2 + 3 * 4,输出:14

输入:(2 + 3) * 4,输出:20

输入:10 / 3,输出:3

输入:5 / 0,输出:Invalid expression.

输入:abc + 3,输出:Invalid expression.