2016-10-02 1 views
1

ich Haskell bin mit in der Schule und eine der Übungen, die ich tun muß, ist eine Funktion zu machen, die mir die Wurzeln einer quadratischen Gleichung ergibt, wenn ich ihm seine Koeffizienten geben, eine vorherige Funktion, die sagt mir, wie viele Lösungen es hat. Hier ist, was ich getan habe:Haskell Quadratic solution finder - Fehler

Erste Funktion, dieser funktioniert:

nRoots :: Float -> Float -> Float -> Int 
nRoots a b c | r<0 = 0 
      | r==0 = 1 
      | otherwise = 2 
      where r = b^2-4*a*c 

Zweite Funktion, funktioniert es nicht:

roots :: Float -> Float -> Float -> [Float] 
roots a b c | nRoots==2 = [(-b-sqrt(b^2-4*a*c))/(2*a),(-b+sqrt(b^2-4*a*c))/(2*a)] 
      | nRoots==1 = [-b/(2*a)] 
      | otherwise = [] 

Hier ist der Fehler, den ich bekommen:

raizes.hs:8:21: 
    No instance for (Eq (Float -> Float -> Float -> Int)) 
     (maybe you haven't applied enough arguments to a function?) 
     arising from a use of ‘==’ 
    In the expression: nRoots == 2 
    In a stmt of a pattern guard for 
        an equation for ‘roots’: 
     nRoots == 2 
    In an equation for ‘roots’: 
     roots a b c 
      | nRoots == 2 
      = [(- b - sqrt (b^2 - 4 * a * c))/(2 * a), 
      (- b + sqrt (b^2 - 4 * a * c))/(2 * a)] 
      | nRoots == 1 = [- b/(2 * a)] 
      | otherwise = [] 

raizes.hs:8:23: 
    No instance for (Num (Float -> Float -> Float -> Int)) 
     (maybe you haven't applied enough arguments to a function?) 
     arising from the literal ‘2’ 
    In the second argument of ‘(==)’, namely ‘2’ 
    In the expression: nRoots == 2 
    In a stmt of a pattern guard for 
        an equation for ‘roots’: 
     nRoots == 2 

Irgendeine Idee, was vor sich geht ??

Vielen Dank im Voraus

EDIT: Vielen Dank für die Antworten! Ich fühle mich ziemlich dumm jetzt nicht es zu merken: X

Antwort

1

Sie müssen die entsprechenden Argumente zu nRoots schaffen, insbesondere roots a b c | nRoots a b c == 2 = ....

Ihre Fehlermeldung besagt, dass obwohl, die durch so gehen lassen, wie Sie diese Fehlermeldung von GHC lesen sollten, um herauszufinden, wie das Ihr Problem. Ich habe die folgende Fehlermeldung mit mehreren Abschnittsmarkierungen markiert.

raizes.hs:8:21: 
    ---------------------BEGIN SECTION A-------------------- 
    No instance for (Eq (Float -> Float -> Float -> Int)) 
     (maybe you haven't applied enough arguments to a function?) 
     arising from a use of ‘==’ 
    In the expression: nRoots == 2 
    ---------------------END SECTION A-------------------- 
    ---------------------BEGIN SECTION B-------------------- 
    In a stmt of a pattern guard for 
        an equation for ‘roots’: 
     nRoots == 2 
    In an equation for ‘roots’: 
     roots a b c 
      | nRoots == 2 
      = [(- b - sqrt (b^2 - 4 * a * c))/(2 * a), 
      (- b + sqrt (b^2 - 4 * a * c))/(2 * a)] 
      | nRoots == 1 = [- b/(2 * a)] 
      | otherwise = [] 
    ---------------------END SECTION B-------------------- 

raizes.hs:8:23: 
    ---------------------BEGIN SECTION C-------------------- 
    No instance for (Num (Float -> Float -> Float -> Int)) 
     (maybe you haven't applied enough arguments to a function?) 
     arising from the literal ‘2’ 
    In the second argument of ‘(==)’, namely ‘2’ 
    In the expression: nRoots == 2 
    In a stmt of a pattern guard for 
        an equation for ‘roots’: 
     nRoots == 2 
    ---------------------END SECTION C-------------------- 

Lassen Sie uns zunächst die Art der == überprüfen.

(==) :: Eq a => a -> a -> Bool 

SECTION A sagt Ihnen, dass == Instanzen der Gleichheit Typklasse erfordert (Eq), um zu arbeiten, weil es für jede Art zu arbeiten, die eine Eq Instanz hat überlastet ist. Leider gibt es keine (und kann keine nicht-triviale) Instanz für Eq für nRoots, weil nRoots selbst eine Funktion ist (think Halt Problem).Der Hinweis, dass GHC hier gibt, ist genau Ihr Problem, nämlich GHC bemerkt, Sie versuchen, die Gleichheit einer Funktion (auf eine Zahl in diesem Fall) zu vergleichen, und schlägt vor, maybe you haven't applied enough arguments to a function?

Okay, so kurz nach SECTION A scheinen wir bereits zu wissen, dass die Problem, das Sie gegenüberstellen, aber lassen Sie uns hier nicht zu hastig sein, vielleicht ist es der Fall SECTION B und SECTION C wird zeigen, dass der Fehler, den Sie in SECTION A sehen, nur ein übermäßiger Fehler ist, der durch etwas tiefer verursacht wird.

Nun SECTION B ist wirklich nur sagen Sie die genaue Lage des Problems in SECTION A, so dass nichts neues ist.

Was ist mit SECTION C? Erinnern Sie sich an den Typ ==? Es stellt sich heraus, dass == erwartet, dass beide Seiten der Gleichheit vom selben Typ sind. Nun sieht GHC nRoots == 2 und erwartet, dass sowohl nRoots als auch 2 vom selben Typ sind. Nun Zahlenliterale in Haskell sind überlastet vom Typ sein Num a => a so dass sie gleichzeitig Int s, Integer s, Double s, Rational s etc. So, jetzt GHC erwartet nRootsNum a => a als Typ darstellen kann, wo a insbesondere Float -> Float -> Float -> Int sein muss, dh es erwartet nRoots eine Instanz der Num Typklasse zu sein.

Nun, wie GHC geschickt andeutet, ist dies wirklich nur ein weiteres Symptom des gleichen Problems! Nämlich, dass Sie vergessen haben, Argumente tatsächlich auf nRoots anzuwenden, und GHC versucht daher, mit einer bloßen Funktion und nicht mit der Ausgabe der Funktion umzugehen.

So Section A und Section C sagen beide, dass Sie das gleiche Problem haben, nämlich sind Sie versuchen, eine Funktion selbst nRoots zu verwenden, wenn Sie voll sein sollten Ihre Argumente für diese Funktion anwenden und die Ausgabe dieser Funktion werden.

5

Sie keine Argumente zu nRoots sind vorbei. Sie können die Fehler beheben, indem die Koeffizienten zu nRoots

roots a b c | nRoots a b c ==2 = ... 

Die Fehlermeldungen vorbei Sie sagen, dass es keine Möglichkeit für Gleichheit (eine Eq Instanz) für Dinge wie nRoots, die Float -> Float -> Float -> Int muss zu überprüfen, geben, und es gibt keine Möglichkeit, die Nummer 2 in eine Nummer desselben Typs umzuwandeln (keine Num Instanz). Beide Fehler ergeben sich aus dem Ausdruck nRoots == 2.

0

Sie haben Ihre Funktion nRoot auf ihre Argumente in Wachen in der zweiten Funktion nicht angewendet. Wenden Sie Ihre Funktionen nRoots zu den Argumenten a, b und c an und dann werden Sie in der Lage sein, das Ergebnis davon zu vergleichen.

http://s017.radikal.ru/i400/1610/83/ca51acaf1362.png