[英]Confusion about data types in Haskell
我必须编写一个简单的 pi 近似值,我做到了,它工作正常,但是在任务中它说要编写一个带有标题“pi_approx :: Int -> Double”的函数。
我的代码:
pi_approx x = sqrt (pi2_approx(x))
pi2_approx x =
if x/= 1
then (6 /(x*x)) + (pi2_approx(x-1))
else (6/(1*1))
然而,我的函数在没有“pi_approx :: Int -> Double”的情况下工作正常,但是当我尝试使用这个声明时,我总是得到类型错误:
pi_approx.hs:10:14: 错误:
Double' with actual type
Int' 匹配我尝试以各种方式使用 fromIntegral,如果我在没有声明的情况下运行该函数,我检查了解决方案的类型,即:“(Floating a, Eq a) => a”
据我了解 Double 应该是 Floating 的一个实例,所以我不明白为什么它不会编译。
我是haskell 的新手,似乎我不了解数据类型和约束的核心概念。 不过,我似乎找不到任何关于该主题的简单而好的文档/解释。 也许这里有人可以根据这个例子帮助我理解:)
因为x
是Int
,因此x * x
也是Int
,并且不能将Int
用于(/) :: Floating a => a -> a -> a
。
您需要将其转换为Double
,例如使用fromIntegral :: (Integral a, Num b) => a -> b
:
pi2_approx :: Int -> Double
pi2_approx 1 = 6
pi2_approx x = 6 / fromIntegral (x*x) + pi2_approx (x-1)
对于大量迭代,它给出接近π 2的结果:
Prelude> sqrt (pi2_approx 10000)
3.1414971639472147
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.