Haskell中的除法错误

nox*_*xus 5 haskell functional-programming

在学校的最后一个小时,我们开始学习Haskell.我们使用Helium编译器因为它快速且易于使用.

我开始在输入标准功能,如*,+...但分工不工作.我试过5 / 24 / 2得到这个消息:

"Type error in infix application
 expression       : 3 / 5
 operator         : /
   type           : Float -> Float -> Float
   does not match : Int   -> Int   -> a "
Run Code Online (Sandbox Code Playgroud)

我如何使用等分运营商获得2.5来自5 / 2

我试过,div 5 2但后来我得到了2而不是2.5

bhe*_*ilr 9

根据文档

  • 数字文字不会过载(即使使用--overloading标志).因此,3是类型Int3.0类型Float.结果是你永远不能写2 + 2.3,虽然在重载模式下你可以写两个2 + 32.0 + 3.0.

另外:

  • 有五个内置类型类,包含以下实例:
    • Num : Int,Float

因此,为了获得浮点除法,您必须使用显式浮点文字,例如5.0 / 2.0.


值得一提的是,在Haskell本身(氦仅仅是哈斯克尔的一个子集)表达5 / 2良好类型的,将有型Fractional a => a,但氦气不会出现有Fractional类型类可言,只有IntFloat为数字类型,所以究竟是怎样有效的Haskell可以像你期望的那样工作在Helium中不起作用.

如果你使用Helium,你可能会cabal根据网站的说明安装它:

> cabal install helium lvmrun
Run Code Online (Sandbox Code Playgroud)

那么你应该有权访问GHC和GHCi.尝试运行GHCi作为交互式shell,看看是否有帮助.您可能会遇到最初比Helium更难读取的错误,但Haskell的类型错误在绝大多数情况下都非常有用.


900*_*000 2

错误消息表明/需要浮点(“实数”)数字,而您提供整数。

您可以将参数显式设置为浮点型5.0 / 2.0

您可以将值转换为浮点(在 GHC 中工作,没有尝试 Helium):

let a = 1::Int
let b = 2::Int
-- here a / b  gives a type error like you reported
show $ fromIntegral a / fromIntegral b -- works
Run Code Online (Sandbox Code Playgroud)