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
相关产品推荐
相关产品推荐

