Haskell中简单除法代码报错原因咨询(新手求助)
Haskell除法函数的类型不匹配错误解析
先看你编写的代码:
division :: Double -> Int -> Double division x k = x / k
加载代码时触发的错误信息:
Prelude> :l main [1 of 1] Compiling Main ( main.hs, interpreted ) main.hs:2:20: error: • Couldn't match expected type ‘Double’ with actual type ‘Int’ • In the second argument of ‘(/)’, namely ‘k’ In the expression: x / k In an equation for ‘division’: division x k = x / k
错误原因
- Haskell是强静态类型语言,不会自动进行数值类型的隐式转换。不像部分动态语言能自动把Int转为Double运算,Haskell要求运算时类型完全匹配。
- 标准除法运算符
(/)的类型为Fractional a => a -> a -> a,意味着它要求两个输入参数必须是相同的Fractional类型(比如Double、Float)。而Int属于Integral类型类,不属于Fractional范畴,无法直接和Double一起参与(/)运算。 - 你的函数签名里,第二个参数
k是Int类型,第一个参数x是Double类型,编译器执行x / k时,期望第二个参数也是Double,但实际传入的是Int,因此触发类型不匹配错误。
修复方法
使用fromIntegral函数将Int类型的k转换为Double类型:
division :: Double -> Int -> Double division x k = x / fromIntegral k
fromIntegral可以把任意Integral类型(如Int、Integer)转换为通用数值类型,这里刚好转为Double,满足(/)的类型要求。
内容的提问来源于stack exchange,提问作者Sven
相关产品推荐
相关产品推荐

