2012-10-21 5 views
0

continue de la question précédente:Utilisation Fractions dans Haskell

Power Series in Haskell

Je suis en train d'écrire la série de puissance dans Haskell,

e^x = 1 + x + x^2/2! + x^3/3! + ... 

telle qu'elle sortira

[1,1,1/2,1/6,...] 

J'ai déjà une fonction ici qui fonctionne sans '/ (factorial y)'

factorial :: (Integral a) => a -> a 
factorial 0 = 1 
factorial n = n * factorial (n - 1) 

powerSrs x = 1 : powerSrsFunc[1..] where 
     powerSrsFunc (p: xs) = 
      p : powerSrsFunc[ (x^y)%(factorial y) | y <-xs ] 

Cependant, je reçois une erreur quand je lance

>take 5 (powerSrs 1) 

<interactive>:34:9: 
    Ambiguous type variable `a0' in the constraints: 
     (Fractional a0) 
     arising from a use of `powerSrs' at <interactive>:34:9-16 
     (Integral a0) 
     arising from a use of `powerSrs' at <interactive>:34:9-16 
     (Num a0) arising from the literal `1' at <interactive>:34:18 
    Probable fix: add a type signature that fixes these type variable(s) 
    In the second argument of `take', namely `(powerSrs 1)' 
    In the expression: take 5 (powerSrs 1) 
    In an equation for `it': it = take 5 (powerSrs 1) 

Encore une fois, il est une erreur de type, que je ne comprends pas.

m'a dit @eakron d'utiliser le package Data.Ratio, mais le (%) imprime un rapport comme si:

2%3 

mais je veux

2/3 

Quelqu'un pourrait-il expliquer les erreurs de type?

+1

Votre approche est un peu encombrée et lente. Une méthode plus intelligente est 'e x = map fst $ itérer (\ (t, n) -> (t * x/n, n + 1)) (1, 1)'. L'idée est que pour trouver un terme dans la série il suffit de connaître son index et le terme qui le précède. –

Répondre

3

Après le premier tour de générateur de powerSrsFunc, l'entrée au powerSrsFunc n'est plus [2, 3 ..]. Au lieu de cela, l'entrée deviendra [1% 2, 1% 6, ..]. Évidemment, il ne peut pas être l'entrée de factorial. Pourquoi ne pas réécrire le powerSrc en un simple?

powerSrs x = [ (x^y) % (factorial y) | y <- [0..] ] 

Aucun générateur d'infini imbriqué. Plus facile à comprendre.