2016-03-26 12 views
-2

Tamam, bu nedenle, işlevin verdiğiniz Taylor genişletme işlemindeki terimlerin sayısına göre pi'yi yaklaşık olarak yaklaştırmaya çalışıyorum. Ancak birçok olduğunu örneği anlaması edemez son hangi hataları alıyorum:Haskell'de yaklaşık bir pi yaklaşımı yapmaya çalışıyor

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

Sen gerçek derleyici hata sonrası gerektiği gibi approx_pi fonksiyonunu tanımlayabilirsiniz verir. Aynı hata mesajında ​​SO aradınız mı ve cevapları orada uygulamaya çalıştınız mı? http://stackoverflow.com/search?q=%5Bhaskell%5D+%22cannot+infer+instance%22? – jberryman

+1

pie_h türü iki argüman alır, ancak verdiğiniz türün yalnızca bir tane vardır. Integral tiplerini gerektiren "mod" kullanıyorsunuz, ancak mantıklı bir bağlamdasınız. –

cevap

1

tip imzası yanlıştır:

burada benim kodudur. Bu tek bir bağımsız değişken, bir Rational alır ve bir Rational döndürür, ancak sonra iki bağımsız değişken, x ve y alır bir işlev olarak tanımlayan bir işlev olduğunu söylersiniz.

pie_h :: Rational -> Rational -> Rational 
pie_h x y = ... 

Ayrıca desen eşleştirme ve birinci dönem işareti değişir tek şey dışarı faktoring ile bu biraz kolaylaştırabilir.

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

Eğer pi için Leibniz's formula kullanıyorsanız, n üzerindeki herhangi pratik değeri için yakınsama gitmiyor. Eğer daha basit bir şekilde

bir invert fonksiyonunu (\x->1/x) ve alternatif toplamı fonksiyonunu tanımlayın bunu uygulayabilirsiniz olursa olsun verimlilik

(x1-x2 + x3 ...) Örneğin

,

tek sayı dizisi

fromRational $ (*) 4 $ altsum $ take 100 $ map invert [1,3..] 
ile ikisini birleştiren Şimdi
import Ratio 

invert :: Integer -> Rational 
invert x = 1%x 

altsum :: (Num a) => [a] -> a 
altsum [] = 0 
altsum (x:xs) = x - altsum xs 

,

3.131592903558553 

Sen hata hakkında bilmedikleri şeylerden yanı sıra

approx_pi n = (fromRational . (*) 4 . altsum . take n . map invert) [1,3..]