www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

paco89

Gepostet:
03.03.2012 15:46

Typen in haskell  
hi,

kann mir ma jmd. sagen, warum bei



f x 1 = [f x x]



als Lösung : nicht typkorrekt
rauskommt?

kann mir jmd. erklären wieso das so ist?


Zum Seitenanfang    
 
IKT

Gepostet:
03.03.2012 16:44

   
Was passiert denn wenn du z.B. f 1 1 aufrufst? Auf der rechten Seite entstünde eine unendlich verschachtelte Liste, das ist nicht möglich und sagt dir auch GHC wenn du mal die Funktion dort eingibst:

Prelude> let f x 1 = [f x x]
<interactive>:1:14:
Occurs check: cannot construct the infinite type: t0 = [t0]
In the return type of a call of `f\'
In the expression: f x x
In the expression: [f x x]


(Gewöhn dir am Besten an über jede Funktion die zugehörige Typsignatur zu schreiben, dann wäre das auch offentsichtlich geworden.)

Abgesehen davon finde ich diese Aufgaben komisch... mehr steht da nicht? Wenn man nicht gerade f 1 1 aufruft ergibt die Funktion auch diesbezüglich keinen Sinn, da nicht definiert
Zum Seitenanfang    
 
paco89

Gepostet:
03.03.2012 17:13

   
ja, das sind klausuraufgaben...ich bereite mich nömlich auf ne klausur vor und in diesen aufgaben geht es halt darum, den typ anzugeben.....okay, die aufgabe versteh ich ein wenig....ich hab eine andere gemacht....ich dachte ich hätte sie richtig und dann wurde ich eines besseren belehrt...:





g h = [ /x ->x, /x-> h x , /x -> h (h x) ]



ich hab das ganze zunächst so interpretiert:

aus der lambdafunktion /x -> h (h x) geht hervor, dass h x eine funktion ist mit der signatur a->b, wobei das x den typ a hat. diese wird wiederum wieder in h (h x) reingesteckt (Stichwort :Komposition).
somit hat doch das letzte element der liste, also die lambda funktion /x -> h (h x) den typ a -> (a->b)->(b->b). und so hab ich dann weitergemacht mit dem rest.

/x-> h x hat dann den typ a->(a->b) und /x ->x den typ a->a

SO INSGESAMT habe ich dann den typ : g :: (a->b) -> [a->a,a->(a->b), a->(a->b)->(b->b)]


aber dann hab ich in die musterlösung geschaut und da stand g :: (b->b)-> [b->b]

woran liegt das? was hab ich falsch gemacht? kann mir jmd das sagen/schreiben ?
Zum Seitenanfang    
 
IKT

Gepostet:
03.03.2012 18:20

   
>dass h x eine funktion ist mit der signatur a->b, wobei das x den typ a hat. diese wird wiederum wieder in h (h x) reingesteckt (Stichwort :Komposition).
und damit h wieder auf (h x) angewandt werden kann ist nicht h :: a->b sondern h: a->a

>also die lambda funktion /x -> h (h x) den typ a -> (a->b)->(b->b).
so wie du es da stehen hast wäre es so, dass die LambdaFunktion auch die Funktion h als 2. Parameter erwartet, sie hat aber nur einen Parameter (x)
Zum Seitenanfang    
 
paco89

Gepostet:
03.03.2012 19:30

   
ich versuch das nachzuvollziehen, aber ich verstehs nicht ganz....
Zum Seitenanfang    
 
paco89

Gepostet:
04.03.2012 22:47

   
vtl. kommt die frage ein bisschen zu spät, aber wie geht man bei solchen aufgaben allgemein vor? Also bis jetzt habe ich das immer ausm bauch heraus gemacht. nun aber frage ich mich, ob es wege gibt, wie man das ganze sehr leicht herausfinden kann.
oder braucht man dafür ein bisschen mehr erfahrung, um das ganz schnell herauszufinden ?
Zum Seitenanfang