使用fromIntegral能否修复Haskell的Int与Float类型不匹配错误?
Haskell出租车计价函数类型报错修复
- 报错根因:Haskell无隐式数值类型转换机制,
(*)运算符要求两个操作数为相同数值类型。原代码中参数x声明为Int类型,直接与Float类型的0.3、0.5相乘时,编译器判定类型不匹配,抛出Couldn't match expected type ‘Float’ with actual type ‘Int’错误。 fromIntegral可完整修复该报错。只需在参与浮点运算的位置,将整数类型的x通过fromIntegral转换为Float类型,即可满足编译器的类型检查要求,修正后的可运行代码如下:taxiFare :: Int -> Float taxiFare x | x >= 10 = longRide | otherwise = shortRide where longRide = 2.2 + (fromIntegral x * 0.3) + 2 shortRide = 2.2 + (fromIntegral x * 0.5)fromIntegral是Haskell中专门用于跨整数-浮点类型转换的标准工具函数,可将任意整数类型的值安全映射为同数值的其他数值类型,适配绝大多数同类类型不匹配场景。- 其他可选解决办法:
- 若不想在每处乘法运算中重复书写
fromIntegral,可在where段提前完成类型绑定,减少重复代码:taxiFare :: Int -> Float taxiFare x | x >= 10 = longRide | otherwise = shortRide where xFloat = fromIntegral x :: Float longRide = 2.2 + (xFloat * 0.3) + 2 shortRide = 2.2 + (xFloat * 0.5) - 若业务场景中行驶里程本身支持小数计数,可直接调整函数签名,将参数类型从
Int改为Float,此时不需要任何额外类型转换即可通过编译。
- 若不想在每处乘法运算中重复书写
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

