2012-10-21 19 views
5

sto cercando di scrivere la serie di potenze in Haskell,potenza Serie in Haskell

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

tale che sarà fuori messo

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

finora ho ottenuto:

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))] 

Tuttavia, capisco che la mia digitazione qui sia sbagliata. Sto ottenendo questo errore:

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) Come si scrive frazioni in Haskell tale che è uscita come '1/2'?

2) Che cosa significa quando si dice Nessuna istanza per (Bool intero) e (Bool frazionale)?

Si riferisce a due argomenti di tipo Integral e Bool?

Non sono necessari Integrali e Integrali?

risposta

9

Nella sintassi della comprensione della lista si hanno tre parti principali. Prendendo il tuo codice come esempio

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

A partire da sinistra, hai ciò che ogni elemento nell'elenco risultante dovrebbe essere. Nel tuo caso, semplicemente y. Dopo il carattere pipe (|) continui specificando come iterare sull'elenco di input. In inglese "per ogni y in xs".

L'ultima parte e il problema sono i filtri. È possibile inserire un elenco di condizioni separate da virgole che devono essere tutte vere per la comprensione delle liste per non filtrare la y corrente. Invece di mettere una condizione lì (qualcosa che è vero o falso) metti lì un'espressione che si traduce in un numero. Tuttavia, presumo che in realtà non vuoi filtrare su nulla. Piuttosto, vuoi produrre il risultato di quell'espressione. Quindi deve essere a sinistra del carattere pipe.

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

Per quanto riguarda la visualizzazione dei numeri razionali, date un'occhiata al pacchetto Data.Ratio http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Ratio.html

+0

non riesco a far funzionare bene le frazioni. Sembra che ci sia solo l'operatore% nel pacchetto Data.Ratio, e mostrerà i rapporti come 2% 3 e non 2/3. – ali

+0

Ah, credo che potresti trasformarlo in una stringa e sostituire% con /. La mia ipotesi è che usi% in modo che possa essere letto di nuovo correttamente. Usare/sarebbe in conflitto con l'uso standard di /. –

+1

oh ragazzo, ora aprirai un'intera nuova serie di domande per quanto riguarda le conversazioni Int -> String. haha. – ali

1

Se siete interessati a fare di più con serie di potenze in Haskell si dovrebbe verificare una grande carta da Douglas McIlroy (di fama UNIX): www.cs.dartmouth.edu/~doug/pearl.ps.gz

Lì definisce un'algebra sopra serie di potenze, che consente di definire l'elevamento a potenza digitando:

expx = 1 + (integral expx) 

e anche altre cose interessanti come la generazione di funzioni.

+0

come si apre il file? – ali

+2

qui c'è una versione pdf: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.38.9450 –