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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:48:15