www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

Sanne1612

Gepostet:
11.11.2012 11:29

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    
 
IKT

Gepostet:
11.11.2012 12:54

   
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    
 
Sanne1612

Gepostet:
11.11.2012 13:59

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    
 
IKT

Gepostet:
11.11.2012 14:32

   
Hast du es mit [q (head xs)] probiert?
Zum Seitenanfang    
 
Sanne1612

Gepostet:
25.11.2012 12:14

So klappt es!  
Danke!
Zum Seitenanfang