2016-03-26 29 views
-2

好吧,所以我想根據您提供給函數的泰勒展開中的術語數來逼近pi。但是我得到了許多錯誤,其最後的是無法推斷例如:試圖在Haskell中做一個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

你應該張貼實際的編譯器錯誤,以及你所不理解的錯誤。你是否搜索過相同的錯誤消息,並試圖在那裏應用答案? http://stackoverflow.com/search?q=%5Bhaskell%5D+%22cannot+infer+instance%22? – jberryman

+1

pie_h的類型有兩個參數,但是你給的類型只有一個參數。您正在使用「mod」,它需要Integral類型,但您處於合理的環境中。 –

回答

1

類型簽名是錯誤的。您說是一個函數,它接受一個參數Rational,並返回Rational,但將其定義爲一個函數,它帶有兩個參數xy

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

如果您正在使用Leibniz's formula圓周率,它不會收斂爲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..]