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

Haskell类问题:如何从类派生指定Yen的数据类型?

Haskell中Yen类型的类派生解决方案

直接派生标准内置类

最省事的方式是在Yen的类型定义后加deriving子句,直接继承Haskell的标准类,覆盖相等判断、字符串转换、排序、数值运算等常用能力:

data Yen = Yen Integer deriving (Eq, Show, Ord, Num)

这么写之后,你可以直接执行这些操作:

  • 相等校验:Yen 100 == Yen 100 返回True
  • 转字符串输出:show (Yen 200) 返回"Yen 200"
  • 数值计算:Yen 50 + Yen 30 得到Yen 80

手动实现类实例(自定义行为或自定义类)

如果需要修改标准类的默认行为,或者要适配你自己定义的类,就得手动编写instance声明:

例子1:自定义Show输出格式

默认Show会输出Yen 100,如果想改成日式金额格式"100円":

data Yen = Yen Integer

instance Show Yen where
  show (Yen amount) = show amount ++ "円"

调用show (Yen 150)就会返回"150円"。

例子2:适配自定义类

假设你定义了一个用于转换人民币的类ToCNY:

class ToCNY a where
  toCNY :: a -> Double  -- 按1日元≈0.05人民币换算

data Yen = Yen Integer

instance ToCNY Yen where
  toCNY (Yen amount) = fromIntegral amount * 0.05

现在用toCNY (Yen 2000)就能得到100.0(对应的人民币金额)。

注意点

  • 派生Num类时,因为底层是Integer整数类型,/除法默认不支持,要么改用整数除法div,要么额外实现Fractional类。
  • 要是派生的类有约束(比如Ord需要类型支持比较),只要你的底层类型(这里是Integer)本身支持,直接派生就行;如果底层类型不支持,就得自己编写实例的逻辑。

内容的提问来源于stack exchange,提问作者user20556271

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:20:23