2016-04-13 3 views
0

Ich versuche, eine Glocke Nummer Finder + Summierung in Haskell zu implementieren. Ich bin ziemlich sicher, dass meine Methoden korrekt sind, aber ich habe Probleme mit einigen Fehlern zur Kompilierzeit. Meine aktuelle Fehlermeldung lautet:Haskell Implementierung von Bell-Nummern

[1 of 1] Compiling Main    (survey2.hs, survey2.o) 
survey2.hs:5:14:** 
    Expected a constraint, but ‘Integer’ has kind ‘*’ 
    In the type signature for ‘binomial’: 
     binomial :: (Integer, Integer) => Integer 

survey2.hs:15:12: 
    Expected a constraint, but ‘Integer’ has kind ‘*’ 
    In the type signature for ‘bellSum’: bellSum :: Integer => Integer** 

Ich bin total neu und neu zu funktionalen Sprachen im Allgemeinen Haskell. Aufgrund dieses Fehlers habe ich versucht, meine "Funktionsdefinitionen" (oder wie immer man sie in Haskell nennt) zu ändern, aber ich verursache einfach mehr Fehler.

Das Endziel des Programms ist, die Summe der Glockennummern 0-9 auszudrucken.

factorial n 
    | n <= 1 = 1 
    | otherwise = n * factorial(n-1) 

binomial :: (Integer, Integer) => Integer 
binomial n k 
    | k > n  = 0 
    | k < 0  = 0 
    | otherwise = factorial(n)/factorial(n-k) * factorial(k) 

bell n 
    | n <= 1 = 1 
    | otherwise = sum [ binomial (n-1, k-1) * bell (k-1) | k<-[0..n-1] ] 

bellSum :: Integer => Integer 
bellSum n = sum [ bell(k) | k<-[0..n] ] 

main = bell(9 :: Integer) 
+0

Das Symbol für einen Funktionstyp ist '->', nicht '=>'. '=>' ist für Typklassenbeschränkungen (von denen ich vermute, dass Sie noch nichts darüber gelernt haben). – luqui

+0

Und eine Definition für eine Funktion "(Integer, Integer) -> Integer" sieht aus wie "binomial (n, k) = ...". Die eine, die Sie haben, entspricht einer Integer -> Integer -> Integer-Funktion (die in Haskell ein viel häufigeres Muster ist). – luqui

+0

[LYAH] (http://learnyouahaskell.com/) wird dringend empfohlen. – luqui

Antwort

1

Beachten Sie, dass dies nicht im Einklang ist (=> sollte -> sein)

binomial :: (Integer, Integer) -> Integer 
binomial n k 

entweder Änderung

binomial :: Integer -> Integer -> Integer 
binomial n k 

oder

binomial :: (Integer, Integer) -> Integer 
binomial (n, k) 

Noch ein Hinweis für Sie, Sie c eine Rechen binomische ohne die Fakultäts-Funktion (oder sogar Multiplikation)

binomial n k | k==0 || k==n = 1 
      | k==1 = n 
      | otherwise = binomial (n-1) (k-1) + binomial (n-1) k 

dies ist immer noch sehr ineffizient, aber es kann memoized werden.

+0

Danke. Irgendwelche wesentlichen Vorteile/Nachteile der Ganzzahl -> Ganzzahl -> Ganzzahl vs (Ganzzahl, Ganzzahl) -> Ganzzahl? Ich habe mein Programm zum (n, k) und jetzt bekomme ich ein anderes, Problem mit dem gleichen Programm. Soll ich eine neue Frage öffnen oder die bestehende ändern? Nicht wirklich sicher auf richtige Etikette für die Frage. –

+1

Wenn die zwei Argumente nicht natürlich sind, ist ein Paar besser zu verwenden 'Ganzzahl -> Ganzzahl -> Ganzzahl ', die in Haskell natürlicher und flexibler ist. – karakfa