使用Haskell实现一个简单的计算器
发布时间:2023-12-10 01:21:12
下面是使用 Haskell 编程语言实现一个简单的计算器的示例代码:
import Data.Char (isDigit)
-- 表达式数据结构
data Exp = Num Int
| Add Exp Exp
| Sub Exp Exp
| Mul Exp Exp
| Div Exp Exp
-- 解析器
parse :: String -> Maybe Exp
parse = parseExp . words
where
parseExp (x:xs) | all isDigit x = parseNumExp (Num (read x)) xs
parseExp _ = Nothing
parseNumExp x [] = Just x
parseNumExp x (op:num:xs) | all isDigit num = case op of
"+" -> parseNumExp (Add x (Num (read num))) xs
"-" -> parseNumExp (Sub x (Num (read num))) xs
"*" -> parseNumExp (Mul x (Num (read num))) xs
"/" -> parseNumExp (Div x (Num (read num))) xs
_ -> Nothing
parseNumExp _ _ = Nothing
-- 计算表达式
eval :: Exp -> Maybe Int
eval (Num x) = Just x
eval (Add exp1 exp2) = (+) <$> eval exp1 <*> eval exp2
eval (Sub exp1 exp2) = (-) <$> eval exp1 <*> eval exp2
eval (Mul exp1 exp2) = (*) <$> eval exp1 <*> eval exp2
eval (Div exp1 exp2) = do
val1 <- eval exp1
val2 <- eval exp2
case val2 of
0 -> Nothing
_ -> Just $ val1 div val2
-- 使用例子
main :: IO ()
main = do
putStrLn "输入一个表达式:"
input <- getLine
case parse input of
Just exp -> case eval exp of
Just result -> putStrLn $ "结果: " ++ show result
Nothing -> putStrLn "除零错误"
Nothing -> putStrLn "无效的表达式"
这个程序包括了一个解析器parse和一个计算器eval。解析器将输入的表达式解析为一个Exp类型的数据结构,计算器对解析得到的表达式进行求值。
你可以在使用例子中使用以下输入,例如 "1 + 2 * 3",程序将计算并输出"结果: 7"。
这个程序支持四则运算,可以处理带括号的复杂表达式。但是如果输入的表达式不符合语法规则,比如存在非数字字符或除零操作,程序将输出相应的错误信息。
希望这个代码可以满足你的需求!
