Haskell中的除法错误

时间:2015-05-06 15:11:11

标签: haskell functional-programming

上学时我们开始学习Haskell。我们使用Helium compiler因为它快速且易于使用。

我开始输入标准函数,例如*+ ... 但该部门不起作用。我尝试了5 / 24 / 2并收到了此消息:

"Type error in infix application
 expression       : 3 / 5
 operator         : /
   type           : Float -> Float -> Float
   does not match : Int   -> Int   -> a "

如何使用devision运算符从2.5获取5 / 2

我尝试div 5 2,但后来我2而不是2.5

2 个答案:

答案 0 :(得分:9)

根据documentation

  
      
  • 数字文字不会重载(即使使用--overloading标志)。因此,3属于Int类型,3.0类型为Float。结果是你永远不能写2 + 2.3,虽然在重载模式下你可以同时写2 + 32.0 + 3.0
  •   

此外:

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

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

值得注意的是,在Haskell本身(Helium只是Haskell的一个子集)中,表达式5 / 2的类型很好,并且类型为Fractional a => a,但Helium似乎没有{ {1}}类型数组,只有FractionalInt作为数字类型,因此实际上有效的Haskell可以正常工作在Helium中不起作用。

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

cabal

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

答案 1 :(得分: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