Haskell多态数据类型实现算术表达式定义与求值的方案问询
实现方案
你当前的Expr类型不是参数化多态类型,Number构造器绑定了固定的(Integer, Double)元组类型,无法适配Int、Double甚至自定义类型的存储需求,我们需要将其改写为带类型参数的多态代数数据类型,再基于Num类型类实现泛用的求值函数。
完整可运行代码
-- 若需要支持字符串类型的expr3,需开启下方扩展 -- {-# LANGUAGE FlexibleInstances #-} -- 定义参数化多态的表达式类型 data Expr a = Number a | Plus (Expr a) (Expr a) | Times (Expr a) (Expr a) deriving Show -- 泛用求值函数,约束类型a必须属于Num类型类(支持加法、乘法运算) eval :: Num a => Expr a -> a eval (Number n) = n eval (Plus e1 e2) = eval e1 + eval e2 eval (Times e1 e2) = eval e1 * eval e2 -- 修正后的测试表达式 expr1 :: Expr Double expr1 = Times (Plus (Number 5.2) (Number 4)) (Number 2) expr2 :: Expr Int expr2 = Plus (Number 2) (Times (Number 3) (Number 4)) -- 可选:实现字符串类型的运算支持,仅演示非标准用法 -- instance Num String where -- (+) = (++) -- (*) = \a b -> concat $ replicate (length b) a -- fromInteger = show -- expr3 = Times (Number "hello") (Number "world") -- 原测试用例无需修改即可运行 testEval1 = "Expected 18.4; eval expr1 returned " ++ show (eval expr1 :: Double) testEval2 = "Expected 14; eval expr2 returned " ++ show (eval expr2 :: Int) testEval = putStr (testEval1 ++ "\n" ++ testEval2 ++ "\n")
运行效果
调用testEval后会输出:
Expected 18.4; eval expr1 returned 18.4 Expected 14; eval expr2 returned 14
内容的提问来源于stack exchange,提问作者SourceCodeEngineer
相关产品推荐
相关产品推荐

