Haskell自定义数据类型如何继承数学运算?
最优实现方案:让Inch实例化Num与Fractional类型类
你的Inch类型本质是Double的包装,要直接使用标准数学运算,最简洁的方式是让它实现Haskell标准库中的Num和Fractional类型类,这样就能复用所有标准算术运算符(+、-、*、/等),无需单独定义每个运算。
完整代码实现
data Inch = Inch Double instance Show Inch where show (Inch i) = show i ++ " inches" -- 实现Num类型类,支持整数转换、加减乘、取反、绝对值等运算 instance Num Inch where fromInteger n = Inch (fromInteger n) (Inch a) + (Inch b) = Inch (a + b) (Inch a) * (Inch b) = Inch (a * b) negate (Inch a) = Inch (negate a) abs (Inch a) = Inch (abs a) signum (Inch a) = Inch (signum a) -- 实现Fractional类型类,支持有理数转换和除法运算 instance Fractional Inch where fromRational r = Inch (fromRational r) (Inch a) / (Inch b) = Inch (a / b)
用法示例
完成类型类实例化后,你可以直接使用所有标准算术操作:
-- 两个Inch实例相加 Inch 2.5 + Inch 3.3 -- 结果:Inch 5.8,显示为 "5.8 inches" -- 两个Inch实例相乘 Inch 4 * Inch 2 -- 结果:Inch 8.0,显示为 "8.0 inches" -- 两个Inch实例相除 Inch 10 / Inch 2 -- 结果:Inch 5.0,显示为 "5.0 inches" -- 整数与Inch运算(通过fromIntegral转换整数为Inch) Inch 7 + fromIntegral 3 -- 结果:Inch 10.0 -- Double与Inch运算(可定义便捷转换函数) inch :: Double -> Inch inch = Inch inch 2.5 + Inch 3 -- 结果:Inch 5.5 Inch 5 / inch 2 -- 结果:Inch 2.5
为什么这更优
- 复用标准库类型类的规范,无需手动定义每个运算符,减少冗余代码
- 支持所有
Num和Fractional提供的运算,包括你没考虑到的操作(如abs、negate) - 符合Haskell类型系统的设计思路,代码更具可读性和可维护性
内容的提问来源于stack exchange,提问作者Jir
相关产品推荐
相关产品推荐

