2012-10-21 2 views
5

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

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

telle qu'elle à mettre

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

jusqu'à présent je me suis:

factorial 0 = 1 
factorial n = n * factorial (n - 1) 

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

Cependant, je comprends que ma frappe ici est erronée. Je reçois cette erreur:

tut08.hs:8:58: 
    No instance for (Integral Bool) 
     arising from a use of `^' 
    Possible fix: add an instance declaration for (Integral Bool) 
    In the first argument of `(/)', namely `(x^y)' 
    In the expression: ((x^y)/(factorial y)) 

    In a stmt of a list comprehension: ((x^y)/(factorial y)) 

tut08.hs:8:62: 
    No instance for (Fractional Bool) 
     arising from a use of `/' 
    Possible fix: add an instance declaration for (Fractional Bool) 
    In the expression: ((x^y)/(factorial y)) 
    In a stmt of a list comprehension: ((x^y)/(factorial y)) 
    In the first argument of `powerSrsFunc', namely 
     `[y | y <- xs, ((x^y)/(factorial y))]' 

1) Comment écrire des fractions dans Haskell vous de telle sorte qu'il est sortie comme « 1/2 »?

2) Qu'est-ce que cela signifie quand ils disent Aucun cas pour (Bool intégrale) et (Fractional Bool)?

Est-il référence à deux arguments qui sont de type intégral et Bool?

-t-il pas intégré et intégrée?

Répondre

9

Dans la syntaxe de compréhension de liste que vous avez trois parties principales. En prenant votre code comme exemple

[y | y <-xs, ((x^y)/(factorial y))] 

À partir de la gauche, vous avez ce que chaque élément de la liste résultante devrait être. Dans votre cas, simplement y. Après le caractère de pipe (|) vous continuez en spécifiant comment itérer sur la liste d'entrée. En anglais "pour chaque y en xs".

La dernière partie, et votre problème, ce sont les filtres. Vous pouvez mettre une liste de conditions séparées par des virgules qui doivent toutes être vraies pour que la compréhension de la liste ne filtre pas le y courant. Au lieu d'y mettre une condition (quelque chose qui est vrai ou faux), vous y mettez une expression qui donne un nombre. Cependant, je suppose que vous ne voulez pas vraiment filtrer quoi que ce soit. Au contraire, vous voulez afficher le résultat de cette expression. Il doit donc être à gauche du caractère de pipe.

[(x^y)/(factorial y) | y <-xs] 

En ce qui concerne que l'affichage des nombres rationnels, jetez un oeil à l'ensemble Data.Ratio http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Ratio.html

+0

je ne peux pas sembler obtenir les fractions bit de droite en cours d'exécution. Il semble qu'il y ait seulement l'opérateur% dans le paquet Data.Ratio, et il affichera les ratios comme 2% 3 et non 2/3. – ali

+0

Ah, je suppose que vous pourriez le transformer en une chaîne et remplacer le% avec /. Je suppose qu'il utilise% pour qu'il puisse être correctement lu à nouveau. Utiliser/serait en conflit avec l'utilisation standard de /. –

+1

oh boy, maintenant que vous allez ouvrir une toute nouvelle série de questions en ce qui concerne les conversations Int -> String. haha. – ali

1

Si vous êtes intéressé à faire plus avec des séries de puissance en Haskell vous devriez vérifier un article de Douglas McIlroy (de la renommée UNIX): www.cs.dartmouth.edu/~doug/pearl.ps.gz

Là, il définit une algèbre sur la série de puissance qui vous permet de définir exponentiation en tapant:

expx = 1 + (integral expx) 

et va également dans d'autres choses cool comme des fonctions génératrices.

+0

comment ouvrez-vous le fichier? – ali

+2

il y a une version pdf ici: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.38.9450 –