Ich versuche diese Frage aus meinen Hausaufgaben zu machen:
Wenn Sie willkürlich sind
foo :: [[a]] -> ([a], [a])
, schreiben Sie ein Gesetz auf, das die Funktionfoo
erfüllt, und zwarmap
in Listen und Paaren.
Ein Zusammenhang: Ich bin ein Student im ersten Jahr, der einen Kurs in funktionaler Programmierung belegt. Während der Kurs eher einführend ist, hat der Dozent viele Dinge aus dem Lehrplan heraus erwähnt, darunter die freien Theoreme. Nachdem ich versucht hatte, Wadlers Artikel zu lesen, rechnete ich damit, dass concat :: [[a]] -> [a]
das Gesetz map f . concat = concat . map (map f)
für mein Problem relevant erscheint, da wir foo xss = (concat xss, concat' xss)
wo concat
und concat'
welche Funktionen vom Typ haben müssen [[a]] -> [a]
. Dann foo
befriedigt bimap (map f, map g) . foo = \xss -> ((fst . foo . map (map f)) xss, (snd . foo . map (map g)) xss)
.
Schon dieses 'Gesetz' scheint zu lang, um richtig zu sein, und ich bin mir auch meiner Logik nicht sicher. Also habe ich darüber nachgedacht, einen kostenlosen Online-Theoremgenerator zu verwenden , aber ich verstehe nicht, was lift{(,)}
bedeutet:
forall t1,t2 in TYPES, g :: t1 -> t2.
forall x :: [[t1]].
(f x, f (map (map g) x)) in lift{(,)}(map g,map g)
lift{(,)}(map g,map g)
= {((x1, x2), (y1, y2)) | (map g x1 = y1) && (map g x2 = y2)}
Wie soll ich diese Ausgabe verstehen? Und wie soll ich das Gesetz für die Funktion foo
richtig ableiten ?
(\(a,b) -> (map f a, map f b)) . foo = foo . map (map f)