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

Haskell实现quarters、dimes、pennies转美元和美分报错求助

Haskell硬币转美元美分代码错误排查与修复

错误分析

  1. 运算符优先级与参数错误:
    toCents quarter dime penny mod 100 中,Haskell会将mod视为toCents的第四个参数,导致函数被传入5个参数(超出定义的3个)。这是因为mod作为中缀运算符需要明确的括号或反引号包裹,否则会被当作普通函数参数处理。同时,/是浮点数除法,但toDollar的类型声明为Int -> Int -> Int -> Int,返回整数,应该使用整数除法div。

  2. 类型不匹配错误:
    sumDollar和sumCents都是Int类型,无法直接与字符串([Char])用++拼接,必须用show函数将整数转换为字符串后再拼接。

修复后的代码

-- Declaration
toCents :: Int -> Int -> Int -> Int
toDollar :: Int -> Int -> Int -> Int

-- Definition
toCents quarter dime penny = quarter * 25 + dime * 10 + penny
-- 直接用整数除法取美元部分,更简洁准确
toDollar quarter dime penny = toCents quarter dime penny `div` 100

main :: IO()
main = do
 let quarter = 12
 let dime = 67
 let penny = 43
 let totalCents = toCents quarter dime penny
 let sumDollar = toDollar quarter dime penny
 -- 直接用mod取余数得到美分部分
 let sumCents = totalCents `mod` 100
 print ("Conversion of " ++ show quarter ++ " quarters, " ++ show dime ++ " dimes, and " ++ show penny ++ " pennies to dollars and cents:")
 print (show sumDollar ++ " dollars and " ++ show sumCents ++ " cents.")

关键修复点说明

  • 修正toDollar的实现:用整数除法div直接计算总美分对应的美元整数部分,替代原复杂且易出错的公式。
  • 计算美分部分:直接用mod运算符取总美分除以100的余数,避免减法运算可能带来的错误。
  • 字符串拼接:对sumDollar和sumCents使用show函数转换为字符串,解决类型不匹配问题。
  • 运算符优先级:用反引号包裹div和mod作为中缀运算符,确保函数参数传递正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:40:27