2016-07-14 26 views
1

Ich versuche eine String-Repräsentation für die Show-Funktion einer Typklasse zu erstellen, die ein Polynom repräsentiert. Ich bekomme immer wieder Typfehler von "Char" zu "[Char]", aber nach meinem Verständnis sollte die "append" -Funktion von haskell in der Lage sein, ein Char mit einem String/[Char] zu verketten. Ich verstehe nicht, wo das Problem liegt, oder wo ich nach einer Lösung suchen soll, die auf den Fehlern basiert, die ich erhalte. hier ist der fehlerhafte code:Fehler Ich konnte den erwarteten Typ 'Char' nicht mit dem tatsächlichen Typ '[Char]' vergleichen

newtype Poly a = P [a] 

instance (Num a, Show a) => Show (Poly a) where 
    show p = ["" : form (p !! i) i | i <- [l,(l-1)..0]] 
     where 
      l = length p 
      form e i 
       | i == 0 = elem 
       | i == 1 = elem ++ "x + " 
       | otherwise = elem ++ "x^" ++ (show i) ++ " + " 
        where elem = show e 

jede hilfe würde sehr geschätzt, danke im voraus.

+2

Ich kann schon einige Probleme sehen, aber Sie sollten wirklich die Definition von 'Poly' posten. – dfeuer

+0

Auch sollten Sie klein anfangen und sich hocharbeiten. Können Sie die 'form'-Funktion auf der obersten Ebene schreiben (nicht in einer' where'-Klausel), mit einer eigenen Typ-Signatur? Sobald Sie das getan haben, können Sie ein wenig aufbauen ... – dfeuer

Antwort

5

Sie schreiben

aus meinem Verständnis Haskells „anhängen“ Funktion sollte einen Char in einen String/[Char] verketten können.

Ich habe keine Ahnung, wo Sie diese Idee haben. Es ist falsch. Ich schätze, Sie haben definiert

type Poly a = [a] 

und ich werde mit dieser Annahme gehen.

instance (Num a, Show a) => Show (Poly a) where 

Das ist falsch. Poly ist ein Typ Synonym. Sie können Instanzen nur für geeignete erstklassige Typen deklarieren (die Anwendung eines Typkonstruktors auf null oder mehr Typvariablen). Sie können dieses Problem beheben, indem Sie stattdessen

newtype Poly a = Poly {getPoly :: [a]} 

aber dann müssen Sie wickeln/auspacken die Poly Daten Konstruktor je nach Bedarf. Sobald Sie das richtig verstanden haben, werden Sie wahrscheinlich feststellen, dass die Num Einschränkung, die Sie gegeben haben, unnötig ist.

show p = ["" ++ form (p !! i) i | i <- [(length p)..0]] 

Es gibt ein paar Probleme. Das große ist, dass dies keine Zeichenfolge (Liste von Zeichen) definiert, sondern eine Liste von Zeichenfolgen. Sie können dies im Allgemeinen beheben, indem Sie concat auf das Ergebnis anwenden. Die zweite ist, dass "" ++ anything nur anything ist, weil das Verketten der leeren Liste mit einer anderen Liste nichts bewirkt. Das dritte Problem ist, dass Sie versuchen zu zählen, aber Sie haben es falsch gemacht. Diese Notation zählt nur hoch. Rückwärts zu zählen, müssen Sie zeigen, dass Sie möchten, rückwärts zu zählen:

let lp = length p in [lp, (lp-1) .. 0] 

Das letzte, was ich sofort sehen (einige dieser Fehler werden in den vorangegangenen zwei Zeilen wiederholt):

| otherwise = e ++ "x^" ++ i ++ " + " 

Jetzt i ist ein Int, und ++ funktioniert nur für Listen. Das wird also nicht funktionieren. Sie müssen zuerst i in eine Zeichenfolge konvertieren, indem Sie show verwenden. e ist vom Typ a und muss ebenfalls in eine Zeichenfolge konvertiert werden. Verwenden Sie dazu auch show.

+0

Ich versuche, die Arbeit in dieser Aufgabe abzuschließen: http://www.seas.upenn.edu/~cis194/hw/04-typeclasses.pdf, das ist, wie ich mit 'newtype Poly a = P [a]' anfange, ich werde das zum Anfang hinzufügen, ich habe den Formularteil, um zu arbeiten, jetzt versuchend, das Verständnis zu machen, alles zusammen zu setzen. Danke für deine Anregungen, es war bisher hilfreich! –

+0

Ich werde auch den Code bearbeiten, um die vorgenommenen Änderungen darzustellen –

Verwandte Themen