好的,所以我试图根据您提供给该功能的泰勒扩展中的术语数来近似pi。但是我收到很多错误,最后一个是无法推断实例:
这是我的代码:
pie :: Rational -> Rational
pie n = 4.0 * (pie_h n 1.0)
pie_h :: Rational -> Rational
pie_h x y = if(x==0) then 0.0
else if ((y mod 2.0)/=0) then (1.0/y)+ pie_h (x-1.0) (y+2.0)
else (-1.0/y)+(pie_h (x-1.0) (y+2.0))
答案 0 :(得分:1)
类型签名错误。你说pie_h
是一个函数,它接受一个参数Rational
,然后返回一个Rational
,然后将它定义为一个带有两个参数的函数,x
和y
。
pie_h :: Rational -> Rational -> Rational
pie_h x y = ...
您还可以通过模式匹配简化这一点,并将唯一不同的因素分解出来,即第一个术语的符号。
pie_h 0 _ = 0.0
pie_h x y = (if even y then -1 else 1) / y + pie_h (x - 1.0) (y + 2.0)
答案 1 :(得分:1)
如果你使用Leibniz's formula作为pi,它就不会收敛于n的任何实际值。
无论效率如何,您都可以更直接的方式实施
定义反转函数(\x->1/x)
和交替和函数(x1-x2 + x3 ......)
例如,
import Ratio
invert :: Integer -> Rational
invert x = 1%x
altsum :: (Num a) => [a] -> a
altsum [] = 0
altsum (x:xs) = x - altsum xs
现在,将两者与奇数系列相结合
fromRational $ (*) 4 $ altsum $ take 100 $ map invert [1,3..]
给出
3.131592903558553
您可以将approx_pi函数定义为
approx_pi n = (fromRational . (*) 4 . altsum . take n . map invert) [1,3..]