www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

rajah

Gepostet:
06.03.2013 00:24

Typbestimmung  
Hallo,

hab paar einige Fragen zu den Typbestimmung bzw. hab probleme mit Lambda ausdrücken/notation

1) h x = y->[x]:[y]

dazu hab ich wie folgt gelöst:
h :: a->b
h:: [a]->[[a]] -- hierzu hab ich y->[x]:[y] betrachtet
aber in der Musterlösung steht: h:: a->[a]->[[a]]
Wieso muss die a davor stehen?

2) h x = y->x++(y:x)

ich weiss, dass
(++):: [a]->[a]->[a] und (:) :: a->[a]->[a] definiert ist.
Dazu hab ich wie folgt die Aufgabe gelöst:
h::a->b
wegen x++(y:x) hab ich
h:: a->[a] raus
aber in der Musterlösung steht: h::[a]->a->[a]
Wieso muss die [a] davor stehen?

Merk selber, dass ich die Lambda notation nicht richtig verstanden hab,sodass ich die obigen Aufgaben nicht richtig lösen konnte.
So etwas wie add = (x y-> x+y) 3 4 versteh ich schon...alles was darüber hinaus fällt mir schwer.

Wäre nett, wenn jemand mir dies erklären könnte.
Gruss,
Rajah
Zum Seitenanfang    
 
Landei

Gepostet:
06.03.2013 09:20

   
1) Das a ist der Typ von x. Man könnte die Funktion auch so umschreiben, dass sie kein Lambda benutzt, dann wird es vielleicht klarer:

h x y = [x] : [y]


Wenn man jetzt x den Typ a gibt, und [a] zum Kopf einer Liste wird, muss die Liste selbst vom Typ [[a]] sein, also auch ihr Rest [y], weswegen y den Typ [a] hat, insgesamt also a -> [a] -> [[a]]

Dein Ansatz a -> b für h ist "im Prinzip" richtig, allerdings ist dein b das zurückgelieferte Lambda, also eigentlich ein c -> d. Da a -> (c -> d) gleich a -> c -> d, kommst du am Ende der ganzen Unifizierungen (oder wie man das nennt) zum gleichen Ergebnis wie ich. Du solltest nochmal genau nachlesen, wie Currying funktioniert, denn ich denke, das ist dein Problem (und nicht die Lambdas).

2) Wieder ist das [a] der Typ von x. Oder wieder umgeschrieben:

h x y = x ++ (y:x)


OK, hier ist das (y : x) entscheidend: Wenn y den Typ a hat, muss x den Typ [a] haben. Das x ++ passt dann auch, weil damit dann ein [a] und ein [a] aneinandergereiht wird. Wir haben also [a] -> a -> [a]

Lass dich nicht von den Lambdas verwirren, du kannst sie immer als separate benannte Funktion schreiben, oder sogar mit der aktuellen Funktion zusammenfasse (wie in diesem Fall):


h = x -> ... --ist-- h x = ...
h x = y -> ... --ist-- h x y = ...
Zum Seitenanfang    
 
rajah

Gepostet:
07.03.2013 01:06

   
Danke Landai ,für die Hilfe!!! so langsam wird mir klarer,nachdem ich mit Currying durchgeboxt hab.
Curry war tatsätzlich mein Problem gewesen

Gruss,
Anand
Zum Seitenanfang