You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 10:27:02