Haskell中定义包含其他数据类型的Currency类型报错求助
解决Haskell中Currency类型定义的类型不匹配问题
嘿,我完全懂你遇到的困扰!咱们先拆解一下问题出在哪,再给你一个直接可行的解决方案。
问题根源
你现在的代码里,Currency是一个空构造子的枚举类型:
data Currency = Euro | Dollar | Yen
而Euro、Dollar、Yen是完全独立的三个数据类型,和Currency的构造子只是名字相同而已,它们之间没有任何隶属关系。所以当你试图把MkDollar 10 50这种Dollar类型的值当成Currency类型使用时,Haskell肯定会抛出类型不匹配的错误——就像你不能把一个整数直接当成字符串用一样。
正确的定义方式
你需要把三种货币作为Currency类型的带参数构造子,而不是独立的数据类型。这样所有货币实例都会属于Currency类型,就能统一处理了。修改后的代码如下:
data Currency = MkEuro Integer Integer | MkDollar Integer Integer | MkYen Integer
这里每个构造子都携带了对应货币需要的数据:
MkEuro携带欧元的元和分(两个Integer)MkDollar携带美元的元和分MkYen携带日元的金额(因为日元没有分单位)
示例函数:统一处理Currency类型
现在你可以写一个统一的函数来处理所有Currency类型的值了,比如一个格式化显示的函数:
formatCurrency :: Currency -> String formatCurrency (MkEuro euros cents) = printf "%d.%02d EUR" euros cents formatCurrency (MkDollar dollars cents) = printf "%d.%02d USD" dollars cents formatCurrency (MkYen yen) = printf "%d JPY" yen
调用这个函数时,不管是哪种货币,都能正确返回格式化后的字符串:
-- 输出 "15.42 EUR" formatCurrency (MkEuro 15 42) -- 输出 "20.05 USD" formatCurrency (MkDollar 20 5) -- 输出 "1000 JPY" formatCurrency (MkYen 1000)
备选方案:保留独立数据类型(不推荐)
如果因为某些原因你必须保留Euro、Dollar、Yen作为独立类型,那你需要给Currency构造子添加对应的类型参数,比如:
data Euro = MkEuro Integer Integer data Dollar = MkDollar Integer Integer data Yen = MkYen Integer data Currency = EuroCurrency Euro | DollarCurrency Dollar | YenCurrency Yen
但这种写法会增加后续处理的复杂度,每次创建Currency实例都要多一层包装(比如EuroCurrency (MkEuro 10 20)),所以更推荐第一种直接把构造子整合到Currency里的方案。
内容的提问来源于stack exchange,提问作者jonas
相关产品推荐
相关产品推荐

