2012-10-21 14 views
5

Próbuję napisać serię mocy w Haskell,Moc Series w Haskell

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

taki sposób, że będzie się umieścić

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

tej pory mam:

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

Rozumiem jednak, że moje pisanie tutaj jest nieprawidłowe. Dostaję taki błąd:

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) Jak piszesz frakcji w Haskell tak, że jest wyjście jak „1/2”?

2) Co to znaczy, gdy mówią: Brak instancji dla (Integral Bool) i (Fractional Bool)?

Czy chodzi o dwa argumenty typu Integral i Bool?

Czy to nie jest integralne i integralne?

Odpowiedz

9

W składni rozumienia listy masz trzy główne części. Przykładowy kod:

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

Począwszy od lewej strony, każdy element na liście wynikowej powinien być. W twoim przypadku po prostu y. Po znaku potoku (|) kontynuujesz, określając sposób iteracji na liście wejściowej. Po angielsku "dla każdego y w xs".

Ostatnią częścią, a twoim problemem są filtry. Możesz umieścić listę warunków oddzielonych przecinkami, które muszą być prawdziwe dla zrozumienia listy, aby nie odfiltrować bieżącego y. Zamiast umieszczać warunek tam (coś, co jest prawdziwe lub fałszywe) umieszczasz tam wyrażenie, które daje liczbę. Jednak zakładam, że właściwie nie chcesz filtrować niczego. Zamiast tego chcesz wyprowadzić wynik tego wyrażenia. Więc musi znajdować się po lewej stronie fajkowego charakteru.

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

Jeśli chodzi o wyświetlanie liczby wymierne, przyjrzeć się opakowaniu Data.Ratio http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Ratio.html

+0

Wygląda na to, że część nie działa poprawnie. Wygląda na to, że w pakiecie Data.Ratio jest tylko operator%, a wskaźniki będą wyświetlane jako 2% 3, a nie 2/3. – ali

+0

Ach, myślę, że możesz zamienić go w łańcuch i zastąpić% za pomocą /. Domyślam się, że używa%, aby można go było poprawnie odczytać ponownie. Używanie/byłoby niezgodne ze standardowym używaniem /. –

+1

O, chłopcze, teraz otworzysz całą serię nowych pytań dotyczących Int -> konwersacji smyczkowych. ha ha. – ali

1

jeśli jesteś zainteresowany czymś więcej z serii elektrowni w Haskell należy sprawdzić wielką papier Douglas McIlroy (UNIX sławy): www.cs.dartmouth.edu/~doug/pearl.ps.gz

tam definiuje algebry nad serii energii, który pozwala na zdefiniowanie potęgowanie wpisując:

expx = 1 + (integral expx) 

, a także przechodzi do innych fajnych rzeczy, takich jak generowanie funkcji.

+0

jak otworzyć plik? – ali

+2

jest tutaj wersja pdf: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.38.9450 –