www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

rajah

Gepostet:
14.02.2013 22:05

Frage zu Typbestimmung  
Hi,

hab paar Fragen zu allgemeinen Typbestimmung:
Welchen Typ hat die Funktion: g = x y -> y 1 ??
Ich weiss, dass "" eine lambda Funktion und 1 eine Int ist.(Mehr kann ich dazu nicht sagen ;) )

Lösung dazu ist : g :: a->(Int->b)->b

Frage:
Wie kann ich an die Aufgabe dran gehen?
Wie komme ich auf das ergebnis?
Was muss ich noch zu der Lambda Funktion wissen?

Wäre nett wenn mir da mal jemand auf die Sprünge hilft.

Zum Seitenanfang    
 
Landei

Gepostet:
15.02.2013 08:30

   
Da fehlt sicher ein Backslash (kann auch sein, dass dieses Forum Backlslashs verschluckt). Wir haben also diese Lambda-Funktion:


\x y -> y 1


Oder als "normale" Funktion:


function x y = y 1


Wir haben also zwei Argumente x und y. Das erste Argument wird nicht weiter verwendet, wir haben keinerlei Informationen, um seinen Typ einschränken zu können. Oder anders ausgedrückt: Es kann "irgendwas" sein. Also geben wir x den polymorphen Typ a. Bei y wissen wir, dass es mit einem Int (nämlich 1, wobei das mit den Zahlen nicht ganz so einfach ist -> Stichwort "Monomorphismus-Beschränkung") aufgerufen wird, aber den Rückgabewert kennen wir nicht (und nennen ihn deshalb b). Also muss y eine Funktion der Form Int -> b sein. Das Resultat dieses Aufrufs ist auch gleichzeitig das Resultat des gesamten Lambda-Ausdrucks, also b. Insgesamt kommen wir zu a -> (Int->b) -> b.

Für einen konkreten Aufruf kannst du dann die konkreten Typen für die polymorphen Typen einsetzen, also würde ein Aufruf


function "bla" even


zur Belegung a = String und b = Boolean führen, und die Signatur würde sich zu String -> (Int -> Boolean) -> Boolean spezialisieren. Das Ergebnis dieses Aufrufs wäre False, weil 1 bekanntlich ungerade ist.

Nun zur Frage mit den Lambdas: Da ist weiter nichts dahinter, es sind halt eine Art "Wegwerf"-Funktionen ohne Namen, du kannst sie aber immer durch normale Funktionen ersetzen:


--mit Lambda
quadriereListe xs = map (\x -> x*x) xs

--mit expliziter Funktion
quadriereListe xs = map quadriere xs where
quadriere x = x * x


Als kleinen Tipp empfehle ich noch ghci, um Typen zu ermitteln, dazu einfach :t vor den fraglichen Ausdruck schreiben (natürlich müssen eigene Funktionen dazu vorher definiert werden).




Zum Seitenanfang    
 
rajah

Gepostet:
16.02.2013 10:09

   
Danke, für die ausführliche antwort Landei...
Zum Seitenanfang