我正在尝试使用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基指数)
错误消息:
ERROR file:.\haskel.hs:33 - Type error in explicitly typed binding *** Term : divpi *** Type : Integer -> Integer *** Does not match : Integer -> Double
如有必要, here 是整个代码
在哈斯克尔, / 工作于 Fractional 类型。然而你的 fatc 和 pot 返回整数。与C不同,Haskell永远不会在任何类型之间进行隐式转换,因此我们需要使用 fromInteger 从中获取非整数值。
/
Fractional
fatc
pot
fromInteger
divpi :: Integer -> Double divpi k = (fromInteger ((fatc (6*k)) * ((545140134*k) + 13591409)) / fromInteger ((fatc (3*k)) * (pot (fatc k) 3) * (pot (-262537412640768000) k)))
此外,作为将来的注意事项,当您有这样复杂的算法时,请考虑使用 where 和 let 创建一些中间变量。除了使内容更具可读性之外,您还可以获得更好的错误消息。
where
let