www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

Anfaenger

Gepostet:
01.12.2010 20:33

Permutation  
Guten Abend,

wir bekamen an der Uni folgende Aufgabe gestellt: Geben Sie eine Funktion "augment :: Char -> [String] -> [String]" an, welche zu jedem in der liste entahltenen String einen gegebenen Buchstaben vorne hinzufügt und die resultierende liste von Strings zurückliefert.

z.B.:
augment 'a' ["bc", "bcd"] == ["abc", "abcd"]
augment 'a' [" "] == ["a"]
augment 'a' [] == []

Ich habe die Funktion zwar schon geschrieben, aber ich weiß nicht wo der Fehler ist. Kann mir jemand helfen?
Mein Ansatz:

augment :: Char -> [String] -> [String]
augment x y = if null y then [] else x : [head(y)] : augment x : [tail(y)]



danke schon mal, liebe Grüße Matthias
Zum Seitenanfang ICQ    
 
Siracusa

Gepostet:
02.12.2010 17:49

   
Hallo,

die eckigen Klammern erzeugen wieder eine Liste, bspw. head y hätte den Typ String, [head y] hätte den Typ [String]. Das wieder mit dem Doppelpunkt verknüpft würde einen Ergebnistyp [[String]] erzeugen, was mit der Typsignatur nicht vereinbar ist. Weiterhin fehlen ein paar runde Klammern, denn im Ausdruck x : y : l müssten x und y den gleichen Typ haben, nur l wäre eine Liste von diesem Typ. Was du eher willst ist ein Element vor die rekursiv berechnete Restliste zu hängen.


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
Anfaenger

Gepostet:
02.12.2010 19:27

   
Hallo,

ok ich habe zwar nicht alles verstanden, aber ich schreib es mal so weit wie ich es verstanden habe.

augment :: Char -> [String] -> [String]
augment x y = if null y then [] else x : (head(y)) : augment x : (tail(y))

Was ich jetzt noch nicht so ganz verstanden habe, warum "x : y : l" ich habe doch garkein "l" definiert und selbst wenn ich es in der Form x (y:l) schreiben würde, muss dann nicht y und l der gleiche Typ haben?

Was ich will hab ich ja beschrieben, die Überschrift hab ich so von dem Übungsblatt übernommen.

Liebe Grüße Matthias
Zum Seitenanfang ICQ    
 
Siracusa

Gepostet:
03.12.2010 20:48

   
Naja, das x : y : l war etwas allgemeiner gehalten. In deinem Fall (so wie es jetzt programmiert ist) wäre x = x, y = (head(y)) und l = augment x : (tail(y)). Somit müssten x und y den gleichen Typ haben, in deinem Fall also x und head y, was offensichtlich nicht der Fall ist, denn x :: Char und head y :: String. Was du willst, ist das x vor das head y zu setzen und damit einen neuen String zu konstruieren, d.h. die Klammern müssen um die beiden Ausdrücke: (x : head(y)).

Dieser gesamte Ausdruck ist nun wieder ein String und wird vor die rekursiv berechnete Restliste gehängt. Da gibt es bei dir allerdings auch noch einen kleinen Fehler, denn augment erfordert zwei Argumente, du gibst nur einen an. Stattdessen aber das tail y als Restliste, was nicht stimmen würde, denn augment muss noch rekursiv auf diese Restliste angewendet werden.


Viele Grüße,

Siracusa
Zum Seitenanfang