Haskell实现quarters、dimes、pennies转美元和美分报错求助
Haskell硬币转美元美分代码错误排查与修复
错误分析
运算符优先级与参数错误:
toCents quarter dime penny mod 100中,Haskell会将mod视为toCents的第四个参数,导致函数被传入5个参数(超出定义的3个)。这是因为mod作为中缀运算符需要明确的括号或反引号包裹,否则会被当作普通函数参数处理。同时,/是浮点数除法,但toDollar的类型声明为Int -> Int -> Int -> Int,返回整数,应该使用整数除法div。类型不匹配错误:
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
相关产品推荐
相关产品推荐

