使用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.
