Haskell调用fact函数报Expected Int Actual Double类型错误求解
报错根本原因
这个问题是Haskell的**运算符类型约束和自动类型推导共同导致的,具体逻辑如下:
(**)运算符的类型签名为Floating a => a -> a -> a,要求左右两个操作数必须是相同的 Floating 类型- 你的
calc_e_to_power函数入参x已经声明为Double类型,因此在表达式x ** idx中,idx会被自动推导为Double类型 - 你生成的列表
[0..9]由于Double实现了Enum类型类,会被自动推导为[Double]类型,也就是元素为0.0、1.0 ... 9.0的浮点数列表 - 你声明的
fact函数入参要求是Int类型,把Double类型的idx传入自然会报类型不匹配错误
相关疑问解答
- 为什么
2.3243 / 3在GHCI中可以正常运行?
数值字面量本身是多态的,3没有显式声明类型时,会根据/运算符的要求自动推导为Double类型,不会出现类型冲突。 - 为什么移除
fact的类型签名后代码可以正常运行?
移除类型签名后,fact函数的类型会根据调用上下文自动推导:由于入参idx是Double,fact会被推导为接受Double返回Double的函数,逻辑上是计算浮点数阶乘,刚好适配你的调用场景,所以不会报错。
推荐修复方案
更稳妥的写法是直接生成整数列表,只在需要浮点运算的地方做类型转换,避免浮点数精度问题:
calc_e_to_power :: Double -> Double calc_e_to_power x = foldr (+) 0 $ map (\idx -> (x ** fromIntegral idx) / fromIntegral (fact idx)) [0..9 :: Int]
内容的提问来源于stack exchange,提问作者vipulbhj
相关产品推荐
相关产品推荐

