【问题标题】:(Haskell) Division resulting in Integer instead of double [duplicate](Haskell)除法导致整数而不是双精度[重复]
【发布时间】:2018-09-01 14:08:22
【问题描述】:

我正在尝试编写一个简单的代码来使用 haskell 获得 PI 的近似值。然而,似乎程序预测除法的结果是一个整数,即使除法从来都不是精确的(再次,它是 PI)......或者至少这是我所理解的:P

代码如下:

divpi :: Integer -> Double
divpi k = (((fatc (6*k)) * ((545140134*k) + 13591409))/((fatc (3*k)) * (pot (fatc k) 3) * (pot (-262537412640768000) k)))

fatc 是阶乘(fatc 数),pot 是整数幂(pot base exponent)

错误信息:

ERROR file:.\haskel.hs:33 - Type error in explicitly typed binding
*** Term           : divpi
*** Type           : Integer -> Integer
*** Does not match : Integer -> Double

如果需要,here 是整个代码

【问题讨论】:

  • 您使用哪个编译器/环境?它看起来不像 gch 的错误信息
  • wiki.haskell.org/Converting_numbers tldr: (1) 类型必须显式转换,(2) 整数没有定义除法,先转换

标签: haskell floating-point integer syntax-error


【解决方案1】:

在 Haskell 中,/ 适用于 Fractional 类型。然而你的 fatcpot 返回整数。 Haskell 与 C 不同,它永远不会在任何类型之间进行隐式转换,因此我们需要使用 fromInteger 来从中获取非整数值。

divpi :: Integer -> Double
divpi k = (fromInteger ((fatc (6*k)) * ((545140134*k) + 13591409)) / fromInteger ((fatc (3*k)) * (pot (fatc k) 3) * (pot (-262537412640768000) k)))

另外,作为将来的说明,当您有这样的复杂算术时,请考虑使用wherelet 创建一些中间变量。除了使内容更具可读性之外,您还将获得更好的错误消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-06
    • 2016-02-18
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    相关资源
    最近更新 更多