【问题标题】:Division error in HaskellHaskell中的除法错误
【发布时间】:2015-05-07 02:25:32
【问题描述】:

在学校的最后一个小时,我们开始学习 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 "

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

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

【问题讨论】:

  • 仅供参考,div 函数是整数除法,而不是浮点除法,这是两个独立且完全有用的东西。

标签: haskell functional-programming


【解决方案1】:

根据documentation

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

另外:

  • 有五个带有以下实例的内置类型类:
    • 号码:IntFloat

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


值得注意的是,在 Haskell 本身(Helium 只是 Haskell 的一个子集)中,表达式 5 / 2 的类型很好,并且类型为 Fractional a => a,但 Helium 似乎没有 Fractional 类型类全部,只有 IntFloat 作为数字类型,所以实际上有效的 Haskell 可以按您的预期工作,但在 Helium 中不起作用。

如果您使用的是 Helium,您可能会按照网站的说明使用 cabal 安装它:

> cabal install helium lvmrun

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

【讨论】:

  • 感谢您的解释。我明白了,它现在可以工作了。
【解决方案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

【讨论】:

    猜你喜欢
    • 2019-04-27
    • 2013-03-21
    • 2015-06-25
    • 1970-01-01
    • 2016-04-16
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多