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

使用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"。

这个程序支持四则运算,可以处理带括号的复杂表达式。但是如果输入的表达式不符合语法规则,比如存在非数字字符或除零操作,程序将输出相应的错误信息。

希望这个代码可以满足你的需求!