Gepostet: |
Signatur für Funktion höherer Ordnung | ||||||||||
Hallo, ich tue mich eh schon schwer mit Signaturen, aber bei Funktionen höherer Ordnung komme ich wirklich nicht weiter. Ich habe die beiden unten stehenden Funktionen. Ich bin der Meinung von der Logik her sollten sie funktionieren (lasse mich da aber gerne eines besseren belehren), aber mit der Signatur komme ich einfach nicht weiter. Ich würde mich freuen, wenn mir jemand helfen könnte. --Die Funktion wendet q auf das 1. Element der Liste an das f=True entspricht --f und q sind Prädikate --Beispiel: applyToFirst (*3) (>3) [2,1,5,7,1,3] = 15 applyToFirst2::(Eq a)=>(a->[a])->a->Bool->[a]->a applyToFirst2 q f xs = applyToFirst2\' q (filter f xs) where applyToFirst2\' q [] = [] applyToFirst2\' q xs = q (head xs) --Die Funktion wendet q auf das 1. Element der Liste an das f=True entspricht --f und q sind Prädikate --Beispiel: applyToFirst (*3) (>3) [2,1,5,7,1,3] = [15,21] applyToAll q f xs = applyToAll\' q (filter f xs) where applyToAll\' q [] = [] applyToAll\' q xs = map q xs Viele Grüße Sanne |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Die Typen bei applyToFirst2\' stimmen nicht überein: einmal gibst du eine Liste zurück ([]) und einmal q, angewandt auf das erste Element von der Liste. q muss ja nicht unbedingt auch eine Liste zurückgeben, z.B: tut das (*3) nicht. Vielleicht möchtest du also so etwas haben: ... = [q (head xs)] - jetzt wird in beiden Fällen eine Liste zurückgegeben. Du könntest auch für diese Zwischenfunktion eine Signatur schreiben. Hast du die Haskell Plattform (http://www.haskell.org/platform/) installiert? Diese beinhaltet den GHC-Kompiler und das interaktive GHCi. Mit letzterem kannst du deine Datei laden (die Funktionssignaturen weglassen) und dann z.B. mit \":t appyToFirst2\'\" dir die TypSignatur ausgeben lassen. Für appyToFirst2\' gibt mir das: (a1 -> a) -> [a1] -> [a]. Also insgesamt: applyToFirst2 q f xs = applyToFirst2\' q (filter f xs) where applyToFirst2\' :: (a1 -> a) -> [a1] -> [a] applyToFirst2\' q [] = [] applyToFirst2\' q xs = [q (head xs)] Jetzt wieder :t auf applyToFirst2 aufgerufen: applyToFirst2 :: (a1 -> a) -> (a1 -> Bool) -> [a1] -> [a]. Du hast also die Klammern um (a -> Bool) vergessen und als Rückgabetyp keine Liste gehabt. :t für applyToAll ergibt (a1 -> a) -> (a1 -> Bool) -> [a1] -> [a] - auch hier wieder nur die Klammern vergessen und a anstatt [a] gehabt. Wieso soll q ein Prädikat sein? f ja, aber q? |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
Weiterhin Probleme | ||||||||||
Hallo, erst einmal danke für den Tipp. Mit Hilfe von :type habe ich nun folgende Signatur erhalten: --Beispiel: applyToFirst (*3) (>3) [2,1,5,7,1,3] = 15 applyToFirst2 :: (a -> ) -> (a -> Bool) -> [a] -> [b] applyToFirst2 q f xs = applyToFirst2\' q (filter f xs) where applyToFirst2\':: (a -> [b]) -> [a] -> [b] applyToFirst2\' q [] = [] applyToFirst2\' q xs = q (head xs) Leider gibt es weiterhin Probleme und es scheint immernoch mit dem Typ zusammen zu hängen. Ich führe das Programm mit den oben genannten Parametern aus und erhalte folgende Meldung in WinHugs. (Die in GHC ist ziemlich lang und sagt wahrscheinlich das selbe) ERROR - Cannot infer instance *** Instance : Num [a] *** Expression : applyToFirst (flip (*) 3) (flip (>) 3) [2,1,5,7,1,3] Oder liegt es halt doch an nem logischen Fehler. |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Hast du es mit [q (head xs)] probiert? | |||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
So klappt es! | ||||||||||
Danke! | |||||||||||
Zum Seitenanfang | |||||||||||